1

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つのクエリプランのみが準備されるようにこれをコーディングする方法はありますか?

4

1 に答える 1

1

長さを使用NVarCharして、予想される最大値に設定します(たとえば、列の最大長が何であれ)。RegionType

6それがの長さであるため、あなたの場合のように見えますCounty

cmd.Parameters.Add(parmRegionType, System.Data.SqlDbType.NVarChar, 6).Value = rgn.Key;
于 2013-02-17T19:07:51.507 に答える