从 LIKE 查询和存储过程中获取不同的结果(开始和结束)搜索
Getting different results from LIKE query and stored procedure for (starts and ends with) search
我正在尝试实现一个存储过程,它获取两个参数@startsWith 和@endsWith 并构造此查询字符串:
@startswith + '%' + @endsWith
搜索以参数开始结束的单个列 (Name
) 的条目。这是存储过程:
CREATE PROCEDURE termNameStartsEndsWith(
@startsWith AS nvarchar,
@endsWith AS nvarchar
)
AS
BEGIN
SELECT * FROM Term WHERE
Name LIKE (@startsWith + '%' + @endsWith)
END;
但是,当两个查询参数之一为空 (''
) 时,我得到了意想不到的结果。这是一个示例,我希望只有 Term
列条目以 'water' 开头的结果,但我得到了一堆额外的行:
作为查询执行时我没有得到这些结果:
所以我认为问题出在存储过程中以不同方式处理空字符串连接?如果是这样,我该如何相应地调整程序?
提前感谢您的帮助。
正如 Larnu 在评论中指出的那样,问题不在于查询,而在于您的参数声明。
您声明了两个 NVARCHAR(n)
参数,但没有为其中任何一个声明长度。来自documentation(强调):
When n is not specified in a data definition or variable declaration statement, the default length is 1. When n is not specified with the CAST function, the default length is 30.
所以两个参数都是一个字符长。方便的是,SQL 服务器会让您为该参数分配一个更长的值,然后只取第一个字符并静默截断其余字符。
将您的参数修改为具有长度定义,您应该开始工作了。
我正在尝试实现一个存储过程,它获取两个参数@startsWith 和@endsWith 并构造此查询字符串:
@startswith + '%' + @endsWith
搜索以参数开始结束的单个列 (Name
) 的条目。这是存储过程:
CREATE PROCEDURE termNameStartsEndsWith(
@startsWith AS nvarchar,
@endsWith AS nvarchar
)
AS
BEGIN
SELECT * FROM Term WHERE
Name LIKE (@startsWith + '%' + @endsWith)
END;
但是,当两个查询参数之一为空 (''
) 时,我得到了意想不到的结果。这是一个示例,我希望只有 Term
列条目以 'water' 开头的结果,但我得到了一堆额外的行:
作为查询执行时我没有得到这些结果:
所以我认为问题出在存储过程中以不同方式处理空字符串连接?如果是这样,我该如何相应地调整程序?
提前感谢您的帮助。
正如 Larnu 在评论中指出的那样,问题不在于查询,而在于您的参数声明。
您声明了两个 NVARCHAR(n)
参数,但没有为其中任何一个声明长度。来自documentation(强调):
When n is not specified in a data definition or variable declaration statement, the default length is 1. When n is not specified with the CAST function, the default length is 30.
所以两个参数都是一个字符长。方便的是,SQL 服务器会让您为该参数分配一个更长的值,然后只取第一个字符并静默截断其余字符。
将您的参数修改为具有长度定义,您应该开始工作了。