いくつかのオプションを考えることができます:
1:IF ... ELSE
IF @Parameter IS NULL
SELECT *
FROM T1
INNER JOIN T2 ON T1.ID = T2.ID
ELSE
SELECT *
FROM T1
INNER JOIN T3 ON T1.ID = T3.ID
2: 動的 T-SQL
DECLARE @SQL NVARCHAR(MAX);
SELECT @SQL = N'SELECT *
FROM T1
INNER JOIN ' + CASE WHEN @Parameter IS NULL THEN N'T2 t' ELSE N'T3 t' END
+ N' ON T1.ID = t.ID';
EXEC sp_executesql @SQL;
3: UNION ALL とサブクエリ。
SELECT *
FROM T1
INNER JOIN
(
SELECT *
FROM T2
WHERE @Parameter IS NULL
UNION ALL
SELECT *
FROM T3
WHERE @Parameter IS NOT NULL
) t ON T1.ID = t.ID
この最後のものについては、オプティマイザが作成する計画をチェックして、パフォーマンスが問題ないかどうかを確認する必要があります。
コードの再利用をお探しのようですので、おそらくオプション 2 が最適です。T-SQL は、この種のポリモーフィズムにはあまり適していませんが、場合によっては回避策を使用できます。
一歩下がって、1 つの質問は、テーブルが同じ構造を持っている場合、1 つのテーブルだけを使用する必要があるかどうかです。次に@Parameter
、動的クエリを作成する代わりに、必要な行をフィルタリングするために使用できます。
このような状況では、ORM などを使用してアプリケーション層でコード生成を処理できることも注目に値します。