【问题标题】:TSQL using a wildcard in a where clause with dynamic sqlTSQL 在带有动态 sql 的 where 子句中使用通配符
【发布时间】:2010-12-10 23:27:45
【问题描述】:

似乎在带有通配符和动态 sql 内部变量的条件中使用 LIKE 不起作用,尽管它不会给出错误。这是一个例子。

名为 code 的列具有 A0B01C02、A0B02C2D05、A0B02C2D05 等值,我正在尝试匹配包含像“B1”这样的子集的行。当我这样做时,它会按预期工作并返回结果。

set @sql='select * from table where code like ''%B01%'''
exec sp_executesql @sql

如果我硬编码变量的值 设置@code='B01' 并修改 sql 语句以连接引号和通配符:

set @sql='select * from table where code like ' +''''+ '%'+@code + '%' + ''''
exec sp_executesql @sql

这会按预期返回结果,但我必须对变量进行硬编码。但是,当我需要使用 B01 的变量进行匹配并且使用 select 语句设置变量时,我没有得到任何返回结果。我这样定义一个 nvarchar:

set @code=(select top 1 code from anotherTable where USERID=@PersonId)

不过,我确认上面的 select 语句返回了预期的代码。没有错误,但查询“执行成功”。我在 where 子句的语法中遗漏了什么吗?

【问题讨论】:

    标签: sql tsql dynamic variables wildcard


    【解决方案1】:

    您可以在http://ask.sqlservercentral.com/questions/275/dynamic-where-clause-how-can-i-use-a-variable-in-an-in-predicate/312#312 找到有关此问题的讨论
    我的答案是使用逗号函数解析。

    /*****************************************************************
    **** Parse A Comma Delimited String Into A Table
    *****************************************************************/
    ALTER  FUNCTION [dbo].[ParseByComma] (
        @String VARCHAR(600) )
    RETURNS @TblSubString TABLE
    (
        VarSubString VARCHAR(50)
    )
    AS
    BEGIN
        DECLARE @intPos INT,
                @SubStr VARCHAR(50)
    
        -- Remove All Spaces
        SET @String = REPLACE(@String, ' ','')
        -- Find The First Comma
        SET @IntPos = CHARINDEX(',', @String)
        -- Loop Until There Is Nothing Left Of @String
        WHILE @IntPos > 0
        BEGIN
            -- Extract The String
            SET @SubStr = SUBSTRING(@String, 0, @IntPos)
            -- Insert The String Into The Table
            INSERT INTO @TblSubString (VarSubString) VALUES (@SubStr)
            -- Remove The String & Comma Separator From The Original
            SET @String = SUBSTRING(@String, LEN(@SubStr) + 2, LEN(@String) - LEN(@SubStr) + 1)
            -- Get The New Index To The String
            SET @IntPos = CHARINDEX(',', @String)
        END
        -- Return The Last One
        INSERT INTO @TblSubString (VarSubString) VALUES (@String)
    RETURN
    END
    

    【讨论】:

    【解决方案2】:

    目前我面前没有 SQL Server,但我想知道这种语法是否适合您?

    set @sql='SELECT * FROM table WHERE UPPER(code) LIKE ''%''||(UPPER(COALESCE('''||@code||''',code)))||' '%''' exec sp_executesql @sql

    最好的问候,

    凯文

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-06-19
      • 1970-01-01
      • 1970-01-01
      • 2022-10-17
      • 2012-08-13
      • 1970-01-01
      • 2011-12-22
      • 2014-09-17
      相关资源
      最近更新 更多