我正在转换一个存储过程,我以前把它写成一个字符串,然后使用位参数决定是否附加某些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,S,这样我就可以使用“真正的”类似SQL的
和中的[field_a](从@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,但是拥有所有重复的语句似乎是草率的。