TSQL с использованием подстановочного знака в предложении where с динамическим sql

Похоже, что использование LIKE в условиях с подстановочными знаками и переменной внутри динамического sql не работает, хотя и не вызывает ошибки. Вот пример.

Столбец с именем 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?


person Tak    schedule 28.10.2009    source источник


Ответы (2)


Вы можете найти обсуждение этого на 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
person Dave    schedule 28.10.2009
comment
вам не нужно использовать цикл для разделения строки на строки, см. это: stackoverflow.com/questions/1456192/ - person KM.; 28.10.2009

На данный момент передо мной нет SQL-сервера, но мне интересно, может ли этот синтаксис подойти вам?

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

С наилучшими пожеланиями,

Кевин

person Kevin Horgan    schedule 28.10.2009