私はあなたがこれにアプローチしている方法はまったく管理できないと思います。質問で示したケースについては、それを1つのクエリにするように努める必要があります。カラムを使用するかどうかをクライアントに決定させます。クライアントにはそれを無視するオプションがあり、引数DeptName
を渡さなければならなかったため、無視することを知っています。EmpDept
クライアントがその列を無視できる場合、3つのクエリが1つになる可能性があります。
SELECT EmpId, EmpName, DeptName
FROM dbo.EMP
WHERE EmpId = CASE
WHEN @QueryId = 'SelEmpById' THEN @EmpId ELSE EmpId END;
このクエリは、3つの条件すべてを解決します。悪い計画で立ち往生するのを避けるために、あなたは手順OPTION (RECOMPILE)
にステートメントを追加することができます。 WITH RECOMPILE
はい、これはオーバーヘッドを引き起こす可能性があります(Joonがそれを鳴らすほど悪くはありません)が、私は1日おきに恐ろしい計画に夢中になっていることを毎回少し編集します。既定では、SQL Server 2000は、単一のストアドプロシージャに対してすべてのパスを最適化することはできません。
もう1つのオプションは、動的SQLを使用して必要なクエリを作成することです。これにより、プランキャッシュが肥大化する可能性がありますが、すべてのオプションを頻繁に使用する場合は、それほど悪くはありません。サーバー設定を使用することで、これがプランキャッシュの肥大化の原因となる可能性のある問題を回避できます。optimize for ad hoc workloads
Erland Sommarskogによる2つの非常に価値のある読み物:
基本的に、動的SQLを恐れないでください。ただし、潜在的な問題に注意してください。
申し訳ありませんが、私の答えはSQL Serverの新しいバージョンを対象としていたため、戻ってきて編集しました。なんらかの理由で、まだSQLServer2000を使用している人がいることを思い出すのは難しいです。