1

我正在转换我之前编写为字符串的存储过程,然后使用 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,但是所有重复的语句似乎很草率

4

1 回答 1

2

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

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

Erland Sommarskog 在 T-SQL 中的动态搜索条件

Erland Sommarskog 的动态 SQL 的诅咒和祝福

于 2010-07-12T18:49:22.937 回答