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