3

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

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

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

如果我硬编码变量 set @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 子句的语法中遗漏了什么吗?

4

2 回答 2

0

您可以在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
于 2009-10-28T18:26:17.770 回答
0

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

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

此致,

凯文

于 2009-10-28T19:51:18.630 回答