C# 2099参数处的SqlCommand最大参数异常
我在一个SqlCommand中批处理不同的查询,当我达到2100参数限制时停止查询批处理。如果我的批处理有2100或2099个参数,我仍然会得到异常 即使参数数小于2100,以下测试代码也会引发“参数过多异常”C# 2099参数处的SqlCommand最大参数异常,c#,sql-server-2008,ado.net,C#,Sql Server 2008,Ado.net,我在一个SqlCommand中批处理不同的查询,当我达到2100参数限制时停止查询批处理。如果我的批处理有2100或2099个参数,我仍然会得到异常 即使参数数小于2100,以下测试代码也会引发“参数过多异常” var parametersMax = 2099; var connection = new SqlConnection(@"Data Source=.;Integrated Security=SSPI;"); connection.Open(); var enumerable =
var parametersMax = 2099;
var connection = new SqlConnection(@"Data Source=.;Integrated Security=SSPI;");
connection.Open();
var enumerable = Enumerable.Range(0, parametersMax);
var query = string.Format("SELECT {0}", String.Join(", ", enumerable.Select(s => string.Format("P{0} = @p{0}",s))));
var command = new SqlCommand(query, connection);
foreach(var i in enumerable)
command.Parameters.Add(string.Format("p{0}",i), i);
// here: command.Parameters.Count is 2099
var reader = command.ExecuteReader(); // throws: The incoming tabular data stream (TDS) remote procedure call (RPC) protocol stream is incorrect. Too many parameters were provided in this RPC request. The maximum is 2100.
考虑到异常消息和这里的文档:我希望在一个查询中能够有2100个参数,但这似乎不是真的。有人知道为什么吗?我错过什么了吗
(我正在使用Sql Server 2008 R2)发送到Sql Server的命令是
exec sp_executesql
N'SELECT P0 = @p0, P1 = @p1, P2 = @p2...',
N'@p0 int,@p1 int,@p2 int...',
@p0=0,@p1=1,@p2=2...
请注意,
sp_executesql
调用中的两个参数槽被查询文本的NVARCHAR
字符串占用,因此参数定义“仅”留下2098供您使用。您使用这么多参数的目的是什么?您考虑过使用表值参数吗?它是否适用于2098/2097/等。我认为SQL默认情况下有一个ReturnValue参数。我无法按设计使用它,我可以将查询拆分为多个批次。我只是想知道为什么我不能像上面说的那样使用2100个参数。0到2099的可枚举范围不会创建2100个参数吗?如果范围为1到2099,它是否有效?@ipr101 Enumerable.range(0,2099)从0()开始创建2099个元素的枚举。我在这个错误前面(这个EXECUTE语句中有太多参数。最大数量是2100)。意识到问题在于sp_executesql参数计数。非常感谢!:)+对于这个答案,我的答案是1。我也有同样的事情发生在我身上。VS报告的command.Parameters.Count正好是2100,SQL Server表明我有超过2100个参数。我三年级的教育告诉我有些不对劲。通过一些实验,我发现2098是真正的最大参数数。因此,从ADO.NET的角度来看,至少可以说错误消息具有误导性。我将最大值设置为2090,以防Microsoft更改其ADO.NET实现。