如何为参数化的nchar获取一个查询计划?

时间:2013-02-17 18:45:24

标签: c# sql-server

我有一个c#web应用程序,它向sql server提交查询。查询有三个参数,两个是int,一个是nchar。我为nchar参数的每个长度获得了不同的查询计划。有没有办法只获得一个计划?

更多细节:

查询相当大且复杂,所以我不会在这里包含所有内容。但是,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”。

当我使用

转储查询计划时
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长度为三个字符(“全部”和“DGP”),五个字符长(“状态”)和六个字符长(“县”)。< / p>

有没有办法对此进行编码,以便只编制一个独立于@RegionType参数长度的查询计划?

1 个答案:

答案 0 :(得分:1)

NVarCharset the length用于最大预期可能值(例如,RegionType列的最大长度为。)

在您的情况下看起来像6,因为这是County

的长度
cmd.Parameters.Add(parmRegionType, System.Data.SqlDbType.NVarChar, 6).Value = rgn.Key;