我需要创建一个需要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