我需要創建一個需要12個參數的存儲過程,並使用此參數的不同組合過濾查詢。所有12個參數都不是強制性的,就像我傳遞3或5或12個參數一樣,取決於用戶輸入的搜索輸入。什麼是更好的,動態SQL還是在哪裏?
我可以創建2種方式,或者使用動態SQL查詢或使用「情況」語句。這些查詢的例子是如下:
動態查詢
DECLARE @sql VARCHAR(MAX) DECLARE @condition VARCHAR(MAX)='' Declare @var1 varchar(10) Declare @var2 varchar(10) Declare @var3 varchar(10) SET @sql='SELECT * FROM TableDemo1 TD1 WITH(NOLOCK) INNER JOIN TableDemo2 TD2 ON TD1.Column1=TD2.Column2' if(@var1 <>0 and @var1 is not null) begin if(@condition<>'') begin set @[email protected] + ' and TD1.columnTest1='[email protected]) end else begin set @condition=' where TD1.columnTest1='[email protected] end end if(@var2 <>0 and @var2 is not null) begin if(@condition<>'') begin set @[email protected] + ' and TD2.columnTest2='[email protected]) end else begin set @condition=' where TD2.columnTest2='[email protected] end end if(@var3 <>0 and @var3 is not null) begin if(@condition<>'') begin set @[email protected] + ' and TD1.columnTest3='[email protected]) end else begin set @condition=' where TD1.columnTest3='[email protected] end end SET @[email protected][email protected] EXEC(@sql)
查詢使用情況
Declare @var1 varchar(10) Declare @var2 varchar(10) Declare @var3 varchar(10) SELECT * FROM TableDemo1 TD1 WITH(NOLOCK) INNER JOIN TableDemo2 TD2 ON TD1.Column1=TD2.Column2 WHERE (CASE WHEN (@var1<>0 and @var1 is not null) THEN CASE WHEN [email protected] THEN 1 ELSE 0 END ELSE 1 END)=1 AND (CASE WHEN (@var2<>0 and @var2 is not null) THEN CASE WHEN [email protected] THEN 1 ELSE 0 END ELSE 1 END)=1 AND (CASE WHEN (@var3<>0 AND @var3 IS NOT NULL) THEN CASE WHEN TD1.columnTest3 = @var3 THEN 1 ELSE 0 END ELSE 1 END) =1
這只是我的存儲過程的一部分,有具有連接的7-8個表格以及如上查詢條件中的各種情況。
如果我使用一個動態查詢,SQL Server將要創建一個執行計劃每一次,但如果我用「情況」這也使得查詢慢。
我知道動態SQL的缺點,但我應該使用哪種技術?
注意'@var <> 0 AND @var IS NOT NULL'僅相當於'@var <> 0'。 – 2011-05-16 15:01:30