2013-02-17 41 views
1

我有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参数的长度?

+0

好吧,我会问长度,看到它你为什么要传递一个固定长度大小不等的一个可变长度参数? – 2013-02-17 19:06:21

+0

@TonyHopkinson,我这样做是因为RegionType在数据库中声明为nchar(10)。看到下面马丁史密斯的回答,我想我不应该有。 – Russ 2013-02-17 19:25:27

+0

这是?我会避免这种情况,或者将所有内容制作成相同的长度。 – 2013-02-17 22:35:14

回答

1

使用NVarCharset the length达到最大预期可能值(例如,不管RegionType列的最大长度是多少)。

看起来6在你的情况下,即是County

cmd.Parameters.Add(parmRegionType, System.Data.SqlDbType.NVarChar, 6).Value = rgn.Key; 
+0

好的,我完全错过了Add()的大小参数。所以即使RegionType在数据库中被定义为nchar(10),我应该在这里使用NVarChar? – Russ 2013-02-17 19:28:06

+0

@Russ - 我通常将参数定义为与列相同的数据类型,因此'NChar(10)'可以。如果你的查询是在执行'r.RegionType LIKE @RegionType +'%'',那么会出现一个带'NCHAR'的问题。这不会像你可能希望的那样工作,因为这些参数会被尾随空格填充。顺便说一句:为什么你使用'NCHAR(10)'作为列定义?列值既不是固定长度,也不是unicode。 – 2013-02-17 19:31:31

+0

你提出了两个好点。 varchar(10)可能会更好,但现在它就是这样。感谢您的帮助。 – Russ 2013-02-17 19:47:13