【问题标题】:Reduce dynamic SQL using CASE to use "IN" or not使用 CASE 减少动态 SQL 是否使用“IN”
【发布时间】:2011-03-14 22:51:45
【问题描述】:

我正在转换一个我之前编写为字符串的存储过程,然后使用 BIT 参数决定是否附加某些 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,这样我就可以使用“真实”SQL 之类的了 AND [FIELD_A] IN(从@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,但是所有重复的语句似乎很草率

【问题讨论】:

    标签: sql stored-procedures dynamic table-valued-parameters


    【解决方案1】:

    根据给定参数动态更改搜索是一个复杂的主题,并且以一种方式进行而不是另一种方式,即使只有非常微小的差异,也会对性能产生巨大影响。关键是使用索引,忽略紧凑代码,忽略重复代码的担心,一定要做好查询执行计划(使用索引)。

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

    Dynamic Search Conditions in T-SQL by by Erland Sommarskog

    The Curse and Blessings of Dynamic SQL by Erland Sommarskog

    【讨论】:

    • 我之前已经阅读了这两篇文章,但是感谢您提供的链接(我希望它们对其他读者有用!)在这种情况下,查询本身已经得到了很好的优化。似乎我别无选择,只能嵌套 IF 语句并重复查询。我希望我可以使用 CASE(或类似的东西)来“打开”WHERE 子句,而不是使用 varchar 然后调用 EXEC() “string-builder”方法与 TVP 不兼容
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-16
    • 2013-01-06
    • 1970-01-01
    • 1970-01-01
    • 2021-12-21
    相关资源
    最近更新 更多