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