Исключение максимальных параметров SqlCommand при 2099 параметрах - PullRequest
16 голосов
/ 08 ноября 2011

Я пакетирую разные запросы в одной 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 Ответ

20 голосов
/ 08 ноября 2011

Команда, отправляемая на 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 для текста запроса и определения параметров, таким образом"only", оставляя 2,098 бесплатно для использования.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...