3

エラーは発生しませんが、ワイルドカードと動的SQL内の変数を含む条件でLIKEを使用すると機能しないようです。これが例です。

コードと呼ばれる列には、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 句の構文に何か不足がありますか?

4

2 に答える 2

0

現在、目の前にSQL Serverはありませんが、この構文が機能するのではないかと思います。

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

よろしくお願いします、

ケビン

于 2009-10-28T19:51:18.630 に答える
0

これに関する議論は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
于 2009-10-28T18:26:17.770 に答える