SqlCommand最大参数异常为2099参数

时间:2011-11-08 12:05:50

标签: 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 = 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.

考虑此处的异常消息和文档:http://msdn.microsoft.com/en-us/library/ms143432.aspx我希望在一个查询中能够拥有2100个参数,但这似乎不是真的。有谁知道为什么?我错过了什么吗?

(我使用的是Sql Server 2008 R2)

1 个答案:

答案 0 :(得分:20)

发送到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调用中的2个参数插槽将被NVARCHAR字符串用于查询文本和参数定义,因此“仅”允许您使用2,098。< / p>