【问题标题】:Is it possible to use a parameter for LIKE / NOT LIKE是否可以为 LIKE / NOT LIKE 使用参数
【发布时间】:2012-10-11 17:52:33
【问题描述】:

我正在尝试传递 LIKE / NOT LIKE 的参数和 % 符号以进行基于从应用程序传递的内容运行的动态查询。我收到一个错误,因为 TSQL 对 like/not like 的参数感到困惑,因为它不是布尔值。是否可以这样做,或者我将不得不编写多个 if 语句来检查正在传递的参数。

@fullName varchar(100), @SrchCriteria1 varchar(15), @SrchCriteria2 varchar(15), 
@fullName1 varchar(100), @SrchCriteria3 varchar(15), @SrchCriteria4 varchar(15),
@fullName2 varchar(100), @SrchCriteria5 varchar(15), @SrchCriteria6 varchar(15),
@qualifer varchar(10), @qualifer1 varchar(10), @qualifer2 varchar(10)

SELECT d.*
FROM   defendants_ALL d, #tmpFullname t1, #tmpFullname1 t2, #tmpFullname2 t3
WHERE  d.combined_name + @qualifer + @SrchCriteria1 + t1.Item + @SrchCriteria2
and  d.combined_name + @qualifer + @SrchCriteria3 + t2.Item + @SrchCriteria4
and  d.combined_name + @qualifer + @SrchCriteria5 + t3.Item + @SrchCriteria6

EXEC uspJudgments @qualifier = 'LIKE', @qualifier1 = 'LIKE', @qualifier = 'NOT LIKE', @fullName = 'johns', @fullName1 = 'jim,j.', @SrchCriteria1 = '%', @SrchCriteria2 = '%',  @SrchCriteria3 = '%', @SrchCriteria4 = '%', @fullName2 = 'johnson', @SrchCriteria5 = '%', @SrchCriteria6 = '%'

所以应该返回 jim johns 和 j 的所有组合。 johns 但不包括 jim johnson 和 j。约翰逊。我知道这是一种罕见的组合,但我想不出更好的更常见的 ATM。

动态 SQL:

DECLARE @Query NVarChar(1024)
SET @Query = 'SELECT d.* FROM defendants_ALL d, #tmpFullname t1, #tmpFullname1 t2, #tmpFullname2 t3'  +
'WHERE d.combined_name' + @qualifier + @SrchCriteria1 + 't1.Item' + @SrchCriteria2 +
' and d.combined_name' + @qualifier + @SrchCriteria3 + 't2.Item' + @SrchCriteria4 +
' and d.combined_name' + @qualifier + @SrchCriteria5 + 't3.Item' + @SrchCriteria6

【问题讨论】:

    标签: tsql select stored-procedures sql-like


    【解决方案1】:

    LIKE 接受模式的表达式,例如d.combined_name LIKE @SrchCriteria.

    您正在尝试组合动态查询。为此,您需要在字符串中创建整个查询,然后使用EXECUTE

    declare @Query as NVarChar(1024) = 'SELECT d.* FROM ...' +
      'WHERE d.combined_name ' + @qualifer + @SrchCriteria1 + t1.Item + @SrchCriteria2 +
      '...'
    

    在传递给EXECUTE 之前,该语句可以通过几个步骤进行组装。

    【讨论】:

    • 我将如何执行该操作?由于我已经将 Execute 用于存储过程,我应该在哪里进行执行调用,是否需要在那里传递参数?
    • @korrowan - 我刚刚更正了答案以显示它从各种常量和变量段组装查询。参数可以传递给EXECUTE 语句或在构建语句时组合到语句中。以这种方式组合语句的一个好处是您可以一次添加一个子句或其中的一部分。例如,基于传入的一个或两个参数,您可以添加一个带有适当字段和方向的ORDER BY 子句。存储过程可以使用EXECUTE,然后可以使用EXECUTE 运行。这不是问题。
    • 我遇到了这个问题,不知道为什么。我把代码代码放在上面。如果我将引号从临时表中的字段中去掉,我会收到一个错误,因为 SQL 不知道它们在哪里,所以我添加了引号,但是在运行上面的代码“d 附近的语法不正确”时出现错误。我是不是建错了?
    • @korrowan - 常见错误是在组合查询时遗漏了空格('SELECT *' + 'FROM' 在 FROM 之前需要一个空格)并且在字符串值周围没有引号(+ Alias.ColumnName + @ComparisonOperator + '''' + @ComparisonStringValue + '''' 周围有明确的引号字符串值)。如果您在 SSMS 中运行查询构建代码并检查组装字符串,您应该能够发现问题。
    • 谢谢@Habo 看起来它就像在 Access 中一样工作,我没有意识到这一点。不过还有一个问题。在 From 子句中,您如何使用多个表。 FROM 子句中的临时表总是出错,我不知道为什么。您是否必须以与我上面不同的方式构建 From 子句?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-24
    • 2013-09-21
    • 2016-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多