当前位置: 首页 > 面试题库 >

什么是更好的动态SQL或在什么情况下使用?

贺自明
2023-03-14
问题内容

我需要创建一个使用12个参数的存储过程,并使用此参数的不同组合来过滤查询。所有12个参数都不是强制性的,好像我传递3或5或12个参数取决于用户输入的搜索输入。

我可以使用动态SQL查询或“ Case where”语句创建2种方法。这些查询的示例如下:

  1. 动态查询

    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 @condition=@condition + ‘ and TD1.columnTest1=’+@var1)
    end
    else
    begin
    set @condition=’ where TD1.columnTest1=’+@var1
    end
    end
    if(@var2 <>0 and @var2 is not null)
    begin
    if(@condition<>’‘)
    begin
    set @condition=@condition + ‘ and TD2.columnTest2=’+@var2)
    end
    else
    begin
    set @condition=’ where TD2.columnTest2=’+@var2
    end
    end

    if(@var3 <>0 and @var3 is not null)
    begin
    if(@condition<>’‘)
    begin
    set @condition=@condition + ‘ and TD1.columnTest3=’+@var3)
    end
    else
    begin
    set @condition=’ where TD1.columnTest3=’+@var3
    end
    end
    SET @sql=@sql+@condition
    EXEC(@sql)

  2. 用CASE WHERE查询

    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 TD1.columnTest1=@var1 THEN 1 ELSE 0 END
    ELSE 1 END)=1
    AND
    (CASE WHEN
    (@var2<>0 and @var2 is not null)
    THEN
    CASE WHEN TD2.columnTest2=@var2 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每次都必须创建一个执行计划,但是如果使用“ case where”,这也会使查询变慢。

我知道动态SQL的缺点,但是应该使用哪种技术?


问题答案:

通常情况下,这取决于条件,但是大多数情况下,我将动态查询作为最后的选择。关于您的问题,我很可能会使用CASE解决方案,但是我认为您的CASE表达式不必要地复杂。我将用以下内容替换WHERE子句:

...
WHERE
    TD1.columnTest1 = COALESCE(NULLIF(@var1, 0), TD1.columnTest1)
    AND   
    TD2.columnTest2 = COALESCE(NULLIF(@var2, 0), TD2.columnTest2)
    AND   
    TD1.columnTest3 = COALESCE(NULLIF(@var3, 0), TD1.columnTest3)

有了正确的索引,这应该不会太慢。



 类似资料:
  • 问题内容: 我已阅读以下讨论: 如果私有帮助器方法可以是静态的,则它们应该是静态的;如果它们的类没有成员变量,则所有方法应该是静态的。 似乎人们通常会接受静态方法,但由于以下两个原因,对此有些怀疑: 他们很难测试。 他们违反了OO原则。(一个人说,它们是函数,而不是方法。) 最可接受的静态方法是 私有静态 方法。但是,为什么为什么根本不存在静态方法呢?在什么情况下,它们是最优先采用的方法? 问题答

  • 问题内容: 我刚刚问了一个与SQL有关的问题,第一个答案是:“在 这种情况下,动态SQL才是可行之路。 ” 因为以前从未听说过 动态SQL ,所以我立即在此站点和Web上搜索了它的含义。维基百科没有与此标题相关的文章。Google的第一个结果全部指向用户论坛,人们在这里或多或少地询问相关问题。 但是,我没有找到关于“动态SQL”的明确定义。这是 特定于供应商的吗? 我使用 MySQL ,但在MyS

  • 本文向大家介绍在什么情况下选择webpack?在什么情况下选择rollup?相关面试题,主要包含被问及在什么情况下选择webpack?在什么情况下选择rollup?时的应答技巧和注意事项,需要的朋友参考一下 非要一句话区分的话 如果是用,如果是用其实界限并不是特别明显。在某些特殊情况下可以互用

  • 问题内容: 我想知道Java(或更普遍的是:在编程中)的一些情况,在布尔表达式中首选使用无条件()而不是有条件版本()。 我知道它们是如何工作的,但是我想不出使用单曲值得的情况。 问题答案: 我发现在现实生活中的情况下,表达的双方都真的很便宜,所以它剃掉了一两纳秒避免分支,使用无条件代替。(不过,这些都是极高性能的数学实用程序;我几乎永远不会在其他代码中使用它,并且如果没有详尽的基准测试来证明它更

  • 请问我们在使用类型注释的时候,何时使用type class名,何时使用class名呢? 我经过如下实验: 比如以上,是否是返回类型为class名称的时候,使用 typeof class名,返回类对象的时候,使用class名?

  • 我正在为朋友构建一个小型聊天应用程序,但不确定如何及时获取信息,而不是像强制刷新页面那样手动或简单。