Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/338.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何为参数化nchar获取一个查询计划?_C#_Sql Server - Fatal编程技术网

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

C# 如何为参数化nchar获取一个查询计划?,c#,sql-server,C#,Sql Server,我有一个向sql server提交查询的c#web应用程序。该查询有三个参数,两个是int,一个是nchar。对于nchar参数的每个长度,我都会得到不同的查询计划。有没有办法只得到一个计划 更多详情: 这个查询相当大和复杂,所以我不会在这里全部介绍。然而,这一部分是不存在的 WHERE gp.Control=@Control AND r.RegionType=@RegionType r、 RegionType是表中定义为nchar(10)的列。My c#code使用以下参数设置参数: cmd

我有一个向sql server提交查询的c#web应用程序。该查询有三个参数,两个是int,一个是nchar。对于nchar参数的每个长度,我都会得到不同的查询计划。有没有办法只得到一个计划

更多详情:

这个查询相当大和复杂,所以我不会在这里全部介绍。然而,这一部分是不存在的

WHERE gp.Control=@Control AND r.RegionType=@RegionType
r、 RegionType是表中定义为nchar(10)的列。My c#code使用以下参数设置参数:

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%'
我得到以下结果(编辑的格式和截断的文本)

因此,您可以看到@RegionType的长度为三个字符(“全部”和“DGP”)、五个字符(“州”)和六个字符(“县”)时有一个查询计划


是否有方法对此进行编码,以便只准备一个查询计划,而不依赖@RegionType参数的长度?

使用
NVarChar
并将其设置为最大预期可能值(例如,
RegionType
列的最大长度是多少)

在您的案例中看起来像是
6
,因为这是
country

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

使用
NVarChar
和最大预期可能值(例如,
RegionType
列的最大长度是多少)

在您的案例中看起来像是
6
,因为这是
country

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

好吧,我会问,既然它是一个可变长度的参数,为什么要以固定长度的形式传递一个不同大小的参数?@TonyHopkinson,我这样做是因为RegionType在数据库中声明为nchar(10)。看到下面马丁·史密斯的答案,我想我不应该这么做。是吗?我会避免这样做,或者让所有内容都具有相同的长度。好吧,我会问,既然它是一个可变长度参数,为什么要将不同大小的内容作为固定长度参数传递?@TonyHopkinson,我这样做是因为RegionType在数据库中声明为nchar(10)。看到下面马丁·史密斯的答案,我想我不应该这么做。是吗?我会避免这样做,或者让所有内容的长度都相同。好吧,我完全错过了要添加的size参数()。因此,即使RegionType在数据库中定义为nchar(10),我也应该在这里使用NVarChar?@Russ-我通常会将参数定义为与列相同的数据类型,因此
nchar(10)
就可以了。如果您的查询执行
r.RegionType,比如@RegionType+'%'
,则会发生一次使用
NCHAR
的gotcha。这不会像您可能希望的那样起作用,因为参数会用尾随空格填充。顺便问一下:为什么要使用
NCHAR(10)
作为此列定义?列值既不是固定长度,也不是unicode。这有两个优点。瓦尔查尔(10)可能会更好,但现在它是什么。谢谢您的帮助。好的,我完全错过了要添加的size参数()。因此,即使RegionType在数据库中定义为nchar(10),我也应该在这里使用NVarChar?@Russ-我通常会将参数定义为与列相同的数据类型,因此
nchar(10)
就可以了。如果您的查询执行
r.RegionType,比如@RegionType+'%'
,则会发生一次使用
NCHAR
的gotcha。这不会像您可能希望的那样起作用,因为参数会用尾随空格填充。顺便问一下:为什么要使用
NCHAR(10)
作为此列定义?列值既不是固定长度,也不是unicode。这有两个优点。瓦尔查尔(10)可能会更好,但现在它是什么。谢谢你的帮助。