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 に変更しているので、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を無視したことは知っていますが、重複したステートメントがすべてずさんなようです

4

1 に答える 1

2

特定のパラメーターに基づいて検索を動的に変更することは複雑な問題であり、非常にわずかな違いであっても、ある方法で別の方法で行うと、パフォーマンスに大きな影響を与える可能性があります。重要なのは、インデックスを使用すること、コンパクトなコードを無視すること、コードの繰り返しについて心配することを無視することです。適切なクエリ実行プランを作成する必要があります (インデックスを使用します)。

これを読んで、すべての方法を検討してください。最適な方法は、パラメーター、データ、スキーマ、および実際の使用法によって異なります。

Erland Sommarskog による T-SQL の動的検索条件

Erland Sommarskog による動的 SQL の呪いと祝福

于 2010-07-12T18:49:22.937 に答える