2009-10-28 111 views
3

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

被称为代码的列具有类似A0B01C02,A0B02C2D05,A0B02C2D05等的值,我试图在包含像B1这样的子集的行上进行匹配。当我这样做时,它会工作并按预期返回结果。

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

如果我硬编码变量 集@码的值=“B01” 和修改SQL语句来连接引号和通配符:

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

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

set @code=(select top 1 code from anotherTable where [email protected]) 

但是,我确认上面的select语句返回了预期的代码。没有错误,但查询“已成功执行”。我是否在where子句的语法中缺少某些内容?

回答

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 
+0

你不需要循环到一个字符串分割成行,看到:HTTP://stackoverflow.com /问题/ 1456192 /比较-A柱到A-列表的值,在-T-SQL/1456404#1456404 – 2009-10-28 18:49:33

0

我目前还没有SQL Server在我面前,但我不知道这个语法是否适合您?

组@ SQL = 'SELECT * FROM表WHERE UPPER(代码)LIKE'%' '||(UPPER(COALESCE(' '' || || @code ''”,代码)))|| '' % ''' EXEC sp_executesql的@sql

最好的问候,

凯文