1

我有向 sql server 提交查询的 c# web 应用程序。查询有三个参数,两个是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 是三个字符长(“All”和“DGP”)、五个字符长(“State”)和六个字符长(“County”)时,有一个查询计划。

有没有办法对此进行编码,以便只准备一个查询计划,而与 @RegionType 参数的长度无关?

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 回答