我正在尝试实现一个存储过程,该过程获取两个参数@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”开头,但我得到了一堆额外的行:
作为查询执行时,我没有得到以下结果:
因此,我认为问题来自于存储过程中处理空字符串连接的方式不同?如果是这样,我如何相应地调整程序?
提前谢谢你的帮助。
1条答案
按热度按时间q43xntqr1#
正如larnu在评论中指出的,问题不在于查询,而在于参数声明。
你有两个
NVARCHAR(n)
已声明参数,但没有为其中任何一个声明长度。从文件中(重点加上):如果在数据定义或变量声明语句中未指定n,则默认长度为1。如果不使用cast函数指定n,则默认长度为30。
所以这两个参数正好是一个字符长。方便的是,SQLServer将允许您为该参数指定一个较长的值,然后只需获取第一个字符,并默默地截断其余的字符。
修改参数以获得长度定义,这样您就可以开始工作了。