OK、条件付き列の第 1 番目の質問:
いくつかのフラグ列の 1 つにマップされた入力パラメーターを受け取るストアド プロシージャを作成しています。要求された列をフィルタリングする最良の方法は何ですか? 私は現在 SQL2000 を使用していますが、SQL2008 に移行しようとしているので、最新のソリューションが利用可能であれば採用します。
sproc でクエリされたテーブルは次のようになります
ID ... fooFlag barFlag bazFlag quuxFlag
-- ------- ------- ------- --------
01 1 0 0 1
02 0 1 0 0
03 0 0 1 1
04 1 0 0 0
そして、私は次のようなことをしたい
select ID, name, description, ...
from myTable
where (colname like @flag + 'Flag') = 1
したがって、sproc を呼び出すと、exec uspMyProc @flag = 'foo'
行 1 と 4 が返されます。
括弧内の部分を SQL で直接実行できないことはわかっています。動的 SQL を実行するには、クエリ全体を文字列に詰め込み、WHERE 句で @flag パラメータを連結してから、文字列を実行する必要があります。動的 SQL を実行しているときに得られる汚れた感覚は別として、私のクエリはかなり大きい (数十のフィールドを選択し、5 つのテーブルを結合し、いくつかの関数を呼び出している) ため、すべてが 1 行であるため、非常に巨大な文字列になります。 3 行の WHERE フィルターで。
または、クエリのコピーを 4 つ用意し、CASE ステートメントでそれらの中から選択することもできます。これにより、SQL コードはそのまま実行可能になります (構文の強調表示などの対象となります) が、WHERE 句だけで CASE を使用できないため、大量のコードを繰り返すという犠牲が伴います。
他のオプションはありますか?適用できるトリッキーな結合や論理演算はありますか? それとも、それを乗り越えて動的 SQL を実行する必要がありますか?