Исключение максимального параметра SqlCommand по параметрам 2099
Я выполняю различные запросы в одном 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
Команда, отправленная на 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...
Обратите внимание, что 2 слота параметров в вызове sp_executesql
обрабатываются с помощью строк NVARCHAR
для текста запроса, а определения параметров, таким образом, "только" оставляют для вас доступным 2,098.