SQLサーバーにクエリを送信するC#Webアプリケーションがあります。クエリには3つのパラメータがあり、2つはintで、1つはncharです。ncharパラメーターの長さごとに異なるクエリプランを取得しています。1つのプランだけを取得する方法はありますか?
詳細:
クエリはかなり大きく複雑なので、ここにすべてを含めることはしません。ただし、WHERE部分があります
WHERE gp.Control=@Control AND r.RegionType=@RegionType
r.RegionTypeは、nchar(10)として定義されたテーブルの列です。私のc#コードは、次のようにパラメーターを設定します。
cmd.Parameters.Add(parmRegionType, System.Data.SqlDbType.NChar).Value = rgn.Key;
ここで、rgn.keyは、「All」、「County」、「DGP」、または「State」の4つの値のいずれかを持つことができます。
クエリプランをダンプするとき
SELECT usecounts, cacheobjtype, objtype, text, query_plan
FROM sys.dm_exec_cached_plans
CROSS APPLY sys.dm_exec_sql_text(plan_handle)
CROSS APPLY sys.dm_exec_query_plan(plan_handle)
WHERE text LIKE '%(@RegionType nchar(%),@CacheCnt int,@Control int)%'
AND text NOT LIKE '%this query%'
次の結果が得られます(編集された形式と切り捨てられたテキスト)
usecounts cacheobjtype objtype text query_plan
--------- ------------- -------- -----------------------------------------------
1 Compiled Plan Prepared (@RegionType nchar(5),@CacheCnt int,@Control...
1 Compiled Plan Prepared (@RegionType nchar(6),@CacheCnt int,@Control...
2 Compiled Plan Prepared (@RegionType nchar(3),@CacheCnt int,@Control...
(3 row(s) affected)
したがって、@ RegionTypeが3文字の長さ(「All」と「DGP」)、5文字の長さ(「State」)、6文字の長さ(「County」)の場合のクエリプランがあることがわかります。
@RegionTypeパラメーターの長さに関係なく1つのクエリプランのみが準備されるようにこれをコーディングする方法はありますか?