我正在转换我之前用字符串写的存储过程然后,使用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,但是所有重复的语句似乎都很草率
答案 0 :(得分:2)
基于给定参数动态更改搜索是一个复杂的主题,并且以一种方式对其进行操作,即使只有非常小的差异,也会产生巨大的性能影响。关键是使用索引,忽略紧凑代码,忽略担心重复代码,必须做出好的查询执行计划(使用索引)。
阅读本文并考虑所有方法。您最好的方法取决于您的参数,数据,架构和实际使用情况: