2016-04-28 30 views
0

動的where句の動作を取得できません。私が使用するクエリ:sp_executesqlでの動的WHERE句の使用

IF NOT EXISTS (SELECT * 
       FROM sys.tables 
       WHERE name = 'a') 
    BEGIN 
     CREATE TABLE a (a INT); 

    END; 
DECLARE @whereClause NVARCHAR(MAX) = ' 1=1 '; 

DECLARE @sql NVARCHAR(MAX) = 'SELECT * FROM a WHERE @whereClause'; 

EXEC sp_executesql @sql, N'@whereClause NVARCHAR(MAX)', @whereClause; 

DROP TABLE a; 

その後、追加の質問は次のようになります。sl_executesqlで実行されるデバッグクエリへの可能性はありますか?

+1

1つの方法は、クエリを実行する前に印刷することです。あなたはPRINT @ sqlを実行することでそれを行うことができます – Mukund

+0

SQL文の一部をパラメータとして使用することはできません。 ( 'set @sql = 'select ... where' + @ where')、これはとにかく(私は' 1 = 0; drop table a --'のような節が好きです):) – Arvo

+0

クエリの一部を変数として渡すことはできません。 where句を含むクエリを動的に構築します。 – Pred

答えて

1

前述のように、sp_executesqlのパラメータを使用して文オブジェクトを置き換えることはできません。パラメータ変数のみを置き換えます。

WHERE節を動的に構築する必要がある場合は、文のオブジェクトコンポーネントにREPLACEを使用する方が簡単です。

DECLARE @whereClause NVARCHAR(MAX) = ' [email protected] '; 
DECLARE @whereVariable INT = 1; 
DECLARE @sql NVARCHAR(MAX) = 'SELECT * FROM a WHERE @whereClause'; 

SELECT @sql = REPLACE(@sql, '@whereClause', @whereClause) 

EXEC sp_executesql @sql 
    ,'@whereVariable INT' 
    ,@whereVariable = @whereVariable; 

これは、ステートメントはinterlived +や変数なしで構築することができることを意味します。それは、入力パラメータと出力パラメータが通常通り使用されることを意味します。