2016-04-28 9 views
0

Ich kann nicht dynamische where-Klausel funktionieren. Die Abfrage ich benutze:Verwenden der dynamischen WHERE-Klausel mit sp_executesql

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; 

Dann weitere Frage wäre: Gibt es eine Möglichkeit zu Debug-Abfrage, die mit sl_executesql ausgeführt wird?

+1

eine Möglichkeit besteht darin, die Abfrage vor der Ausführung zu drucken. Sie können dies tun, indem Sie einfach PRINT @ sql – Mukund

+0

Sie können nicht Teil der SQL-Anweisung als Parameter verwenden. Sie könnten vorher eine ganze Anweisung erstellen ('set @sql = 'select ... where' + @ where'), aber das ist sowieso eine schlechte Idee (Ich mag Klauseln wie' 1 = 0; drop table a --') :) – Arvo

+0

Sie können einen Teil der Abfrage nicht als Variable übergeben. Konstruieren Sie Ihre Abfrage dynamisch einschließlich der WHERE-Klausel. – Pred

Antwort

1

Wie bereits erwähnt, können Sie die Parameter unter sp_executesql nicht verwenden, um Anweisungsobjekte zu ersetzen, nur Parametervariablen. Wenn Sie die WHERE-Klausel dynamisch erstellen müssen, finde ich es einfacher REPLACE für die Objektkomponenten der Anweisung zu verwenden.

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; 

Dies bedeutet, dass die Aussage ohne interlived + und Variablen gebaut werden. Es bedeutet dann, dass die Eingabe- und Ausgabeparameter normal verwendet werden.

Verwandte Themen