TSQL с использованием подстановочного знака в предложении where с динамическим sql - PullRequest
3 голосов
/ 28 октября 2009

Похоже, что использование 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?

Ответы [ 2 ]

0 голосов
/ 28 октября 2009

В настоящий момент у меня нет SQL Server, но мне интересно, может ли этот синтаксис работать на вас?

set @ sql = 'SELECT * ИЗ таблицы, ГДЕ ВЕРХ (код), КАК' '%' '|| (ВЕРХ (COALESCE (' '' || @code || '' ', код))) ||' '%' '' exec sp_executesql @ sql

С уважением,

Кевин

0 голосов
/ 28 октября 2009

Вы можете найти обсуждение этого в http://ask.sqlservercentral.com/questions/275/dynamic-where-clause-how-can-i-use-a-variable-in-an-in-predicate/312#312
Мой ответ состоял в том, чтобы выполнить функцию Parse By Comma.

/*****************************************************************
**** 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
...