以前に文字列として記述したストアド プロシージャを変換し、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 に変更しているので、AND [FIELD_A] IN (SELECT [TVP_FIELD] FROM @pTVP_A) のような「実際の」SQL を使用できます。
これを行うと、文字列を構築する方法が好きではありません
ただし、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を無視したことは知っていますが、重複したステートメントがすべてずさんなようです