2016-04-28 88 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

一種方法是在執行它之前打印查詢。你可以通過PRINT @sql來做到這一點 – Mukund

+0

你不能使用部分SQL語句作爲參數。你可以事先建立完整的語句('set @sql ='select ... where'+ @ where'),但這是個壞主意(我喜歡'1 = 0; drop table a - '):) – Arvo

+0

您無法將查詢的一部分作爲變量傳遞。動態構建查詢,包括where子句。 – Pred

回答

1

如前所述,您不能使用sp_executesql上的參數來替換語句對象,只能使用參數變量。

如果您需要動態構建WHERE子句,我發現使用REPLACE可以更容易地爲語句的對象組件使用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; 

這意味着該語句可以在沒有交織+和變量的情況下構建。這意味着輸入和輸出參數正常使用。