从like查询和存储过程中获取不同的结果以进行搜索(以开始和结束)

lbsnaicq  于 2021-08-09  发布在  Java
关注(0)|答案(1)|浏览(372)

我正在尝试实现一个存储过程,该过程获取两个参数@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”开头,但我得到了一堆额外的行:

作为查询执行时,我没有得到以下结果:

因此,我认为问题来自于存储过程中处理空字符串连接的方式不同?如果是这样,我如何相应地调整程序?
提前谢谢你的帮助。

q43xntqr

q43xntqr1#

正如larnu在评论中指出的,问题不在于查询,而在于参数声明。
你有两个 NVARCHAR(n) 已声明参数,但没有为其中任何一个声明长度。从文件中(重点加上):
如果在数据定义或变量声明语句中未指定n,则默认长度为1。如果不使用cast函数指定n,则默认长度为30。
所以这两个参数正好是一个字符长。方便的是,SQLServer将允许您为该参数指定一个较长的值,然后只需获取第一个字符,并默默地截断其余的字符。
修改参数以获得长度定义,这样您就可以开始工作了。

相关问题