代码之家  ›  专栏  ›  技术社区  ›  Matthew

减少使用“in”或“not”的动态SQL用例

  •  1
  • Matthew  · 技术社区  · 14 年前

    我正在转换一个存储过程,我以前把它写成一个字符串,然后使用位参数决定是否附加某些where/on子句。

    此sp将传递一些逗号分隔的字符串,然后传递一些动态where子句,如下所示:

    IF @pUse_Clause_A THEN SET @WhereClause = @WhereClause + ' AND [FIELD_A] IN (' + @pComma_Separated_List_A + ')'
    

    在本例中,@pcomma_separated_list_a类似于'1,3,6,66,22'…我想要的东西的清单。

    现在我把这些从字符串改为TVP,S,这样我就可以使用“真正的”类似SQL的 和中的[field_a](从@ptvp_a中选择[tvp_field])

    当我这样做的时候,我不喜欢弦的建立方法

    但是,我也不喜欢嵌套if语句。

    IF A 
        ENTIRE SQL WHERE A
    ELSE
        ENTIRE SQL WITHOUT WHERE CLAUSE
    

    我添加的参数越多,它就越复杂:

    IF A
        IF B
            SQL WHERE A AND B
        ELSE
            SQL WHERE A
    ELSE
        IF B
            SQL WHERE B
        ELSE
            SQL
    

    我宁愿这样做:

    SELECT * FROM TABLE
    WHERE 1=1
    CASE USE_A WHEN 1 THEN 
         AND [FIELD_A] IN (SELECT A FROM TBP_A)
    END
    CASE USE_B WHEN 1 THEN
         AND [FIELD_B] IN (SELECT B FROM TVP_B)
    END
    

    我知道它忽略了所选“if”结果之外的SQL,但是拥有所有重复的语句似乎是草率的。

    1 回复  |  直到 14 年前
        1
  •  2
  •   KM.    14 年前

    基于给定参数动态更改搜索是一个复杂的主题,以一种方式对另一种方式进行搜索,即使只有很小的差异,也可能会产生巨大的性能影响。关键是要使用索引,忽略压缩代码,忽略担心重复代码,必须制定一个好的查询执行计划(使用索引)。

    阅读本文并考虑所有方法。您的最佳方法将取决于您的参数、数据、模式和实际使用情况:

    Dynamic Search Conditions in T-SQL by by Erland Sommarskog

    The Curse and Blessings of Dynamic SQL by Erland Sommarskog