【问题标题】:Getting different results from LIKE query and stored procedure for (starts and ends with) search从 LIKE 查询和存储过程中获取不同的结果(开始和结束)搜索
【发布时间】:2020-05-18 12:20:25
【问题描述】:

我正在尝试实现一个存储过程,它获取两个参数@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 列条目以“水”开头的结果,但我得到一堆额外的行:



作为查询执行时我没有得到这些结果:



所以我认为问题出在存储过程中以不同方式处理的空字符串连接?如果是这样,我该如何相应地调整程序?

提前感谢您的帮助。

【问题讨论】:

  • 这与LIKE 无关,也与您使用nvarchar(1)s 无关。 总是声明您的长度、比例和精度。 Bad habits to kick : declaring VARCHAR without (length)。该查询完全按照应有的方式工作,因为所有这些字符串都以 'W' 开头;这就是您有效作为参数传递的内容。你的WHERE 不是LIKE N'water' + '%' + N'',而是LIKE N'W' + '%' + N''。运行它,你会得到和你的 SP 一样的结果。

标签: sql sql-server tsql sql-server-2019


【解决方案1】:

正如 Larnu 在 cmets 中所指出的,问题不在于查询,而在于您的参数声明。

您声明了两个NVARCHAR(n) 参数,但没有为它们中的任何一个声明长度。来自documentation强调):

在数据定义或变量声明语句中未指定n时,默认长度为1。在CAST函数中未指定n时,默认长度为30。

所以两个参数都只有一个字符长。方便的是,SQL Server 将允许您为该参数分配更长的值,然后只需获取第一个字符并静默截断其余字符。

修改您的参数以具有长度定义,您应该在做生意。

【讨论】:

  • 是的,这就是问题所在。感谢您和 Larnu 的解决方案!
  • 很高兴它有帮助! Aaron Bertrand 的“坏习惯”系列多次救了我的命。读起来不错。
猜你喜欢
  • 2018-12-27
  • 2021-03-27
  • 2022-11-13
  • 1970-01-01
  • 2013-01-30
  • 2017-04-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多