我有c#web应用程序提交查询到sql server。该查询有三个参数,其中两个是整数,另一个是nchar。我为每个nchar参数的长度获得了不同的查询计划。有没有办法只得到一个计划?如何获取参数化nchar的一个查询计划?
更多的细节:
查询是相当大的,复杂的,所以我不会在这里inlcude这一切。但是,其中部分是
WHERE [email protected] AND [email protected]
r.RegionType是定义为nchar(10)的表中的一列。我的C#代码,设置与下列参数:
cmd.Parameters.Add(parmRegionType, System.Data.SqlDbType.NChar).Value = rgn.Key;
其中rgn.key可能有以下四个值之一:“全部”,“县”,“DGP”,或“国家”。
当我转储
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”),五个字符长(“州”)和六个字符长(“县”)。
有没有一种方法来编写代码,以便只有一个查询计划准备独立于@RegionType参数的长度?
好吧,我会问长度,看到它你为什么要传递一个固定长度大小不等的一个可变长度参数? – 2013-02-17 19:06:21
@TonyHopkinson,我这样做是因为RegionType在数据库中声明为nchar(10)。看到下面马丁史密斯的回答,我想我不应该有。 – Russ 2013-02-17 19:25:27
这是?我会避免这种情况,或者将所有内容制作成相同的长度。 – 2013-02-17 22:35:14