我在一个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)
答案 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>