使用CASE减少动态SQL以使用“IN”

时间:2010-07-12 18:28:29

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

我正在转换我之前用字符串写的存储过程然后,使用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(SELECT [TVP_FIELD] FROM @pTVP_A)

当我这样做时,我不喜欢字符串构建方法

但是,我也不喜欢嵌套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 个答案:

答案 0 :(得分:2)

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

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

Dynamic Search Conditions in T-SQL by by Erland Sommarskog

The Curse and Blessings of Dynamic SQL by Erland Sommarskog