Какова максимальная длина запроса SqlCommand?

В настоящее время я обновляю и читаю значения с помощью сценария C # из SQL Server 2014. При использовании SQlCommand для выполненияNonQuery выдает ошибку при запуске сценария:

IndexOutOfRangeException: индекс массива вне допустимого диапазона.
Mono.Data.Tds.Protocol.TdsComm.AppendInternal (Int16 s)
Mono.Data.Tds.Protocol.TdsComm.Append (System.String s)
Mono.Data.Tds.Protocol.Tds70.WriteRpcParameterInfo (параметры Mono.Data.Tds.TdsMetaParameterCollection)
Mono.Data.Tds.Protocol.Tds70.ExecRPC (TdsRpcProcId rpcId, System.String sqlds, Mono.Data. Параметры TdsMetaParameterCollection, время ожидания Int32, логическое значение wantResults)
Mono.Data.Tds.Protocol.Tds70.Execute (System.String commandText, Mono.Data.Tds.TdsMetaParameterCollection параметры, время ожидания Int32, логическое значение wantResults)
System.Data .SqlClient.SqlCommand.Execute (логическое значение wantResults)
System.Data.SqlClient.SqlCommand.ExecuteNonQuery ()
(оболочка удаленного вызова с проверкой)
System.Data.SqlClient.SqlCommand: ExecuteNonQuery ( )
Database.DataBaseConnection.Update () (в Assets / DataBaseConnection.cs: 674)

Я посчитал, сколько символов имеет SqlCommand, и это 8 125 символов (без пробелов), 10 874 символа (с пробелами).

Есть 198 параметров, но я думаю, что это не из-за этого, потому что где-то я читал, что максимальное количество параметров для одного запроса было 2000, я прав?

Я уменьшил количество параметров (до 20 параметров) и, соответственно, длину команды, и это работает как шарм (875 символов без пробелов и 1221 символ с пробелами).

Подводя итог, мой вопрос: какова максимальная длина SqlCommand запроса в SQL Server 2014? А в SQL Server 2008?

Образец моего кода:

//New command to update values in input table in sql server
using (SqlCommand command = new SqlCommand("UPDATE DigitalInputs" +
    " SET Value = CASE Name" +
    " WHEN @LI_Input_Variable1_Name THEN @LI_Input_Variable1_Value" +
    " WHEN @LI_Input_Variable2_Name THEN @LI_Input_Variable2_Value" +
    " WHEN @LI_Input_Variable3_Name THEN @LI_Input_Variable3_Value" +
    //It is the same from 3 till 99
    " WHEN @LI_Input_Variable99_Name THEN @LI_Input_Variable99_Value" +
    " END" +
    " WHERE Name IN (@LI_Input_Variable1_Name, @LI_Input_Variable2_Name, @LI_Input_Variable3_Name,
    //It is the same from 3 till 99
    @LI_Input_Variable99_Name);", connection))
{

command.Parameters.Add(new SqlParameter("LI_Input_Variable1_Name", "LI_Input_Variable1"));
command.Parameters.Add(new SqlParameter("LI_Input_Variable1_Value", LI_Input_Variable1.ToString()));
command.Parameters.Add(new SqlParameter("LI_Input_Variable2_Name", "LI_Input_Variable2"));
command.Parameters.Add(new SqlParameter("LI_Input_Variable2_Value", LI_Input_Variable2.ToString()));
command.Parameters.Add(new SqlParameter("LI_Input_Variable3_Name", "LI_Input_Variable3"));
command.Parameters.Add(new SqlParameter("LI_Input_Variable3_Value", LI_Input_Variable3.ToString()));
//It is the same from 3 till 99
command.Parameters.Add(new SqlParameter("LI_Input_Variable99_Name", "LI_Input_Variable99"));
command.Parameters.Add(new SqlParameter("LI_Input_Variable99_Value", LI_Input_Variable99.ToString()));

command.ExecuteNonQuery(); //Execute the non query
}

После редактирования: я реализую этот сценарий с помощью MonoDevelop 5.9.6. в Unity3D


person MetalxBeat    schedule 01.04.2016    source источник
comment
Я не думаю, что это parameter length проблема. Должен быть какой-то parameter, который является своего рода массивом и его причиной IndexOutOfRange Exception .. Без дополнительных подробностей трудно ответить, что на самом деле вызывает проблему ..   -  person Guruprasad J Rao    schedule 01.04.2016
comment
Пожалуйста, предоставьте образец вашего кода C #.   -  person mxix    schedule 01.04.2016
comment
если нужно спросить ... это слишком долго :)   -  person Jeremy    schedule 01.04.2016
comment
Я только что отредактировал свой вопрос, добавив в него сокращенный фрагмент кода. Это немного хаотично, но это работает, я пытался использовать dataTable и xml, но так как это не сработало, я подумал о том, чтобы сделать это таким образом.   -  person MetalxBeat    schedule 01.04.2016
comment
Этот код не воспроизводит ошибку и не имеет отношения к заданному вами вопросу. Голосование закрыто. Пожалуйста, повторно откройте новый вопрос с полным примером компиляции.   -  person TomTom    schedule 01.04.2016
comment
Мне очень жаль, но я думаю, что это полностью связано с моим вопросом. Я подумал, что было бы нежелательно приводить полный пример компиляции, так как он был бы слишком длинным. Но если дело в этом, я могу это сделать без проблем!   -  person MetalxBeat    schedule 01.04.2016
comment
Не давайте нам просто длинный дамп кода - убедитесь, что вы создали минимально воспроизводимый пример. С упором на минимальное.   -  person Damien_The_Unbeliever    schedule 01.04.2016
comment
@MetalxBeat Нет, это не так. Вопрос в том, как долго может быть заявление (прочтите заголовок). Если ваше утверждение будет слишком длинным, ошибка будет другой. Таким образом никакого отношения. Да, это не тот вопрос, на который вы хотели получить ответ, но это тот, который вы задали.   -  person TomTom    schedule 01.04.2016
comment
Старайтесь использовать более короткие имена :-) 100 x 3 x LEN(@LI_Input_Variable1_abcde) очень много, 100 x LEN(@vXX) + 200 x LEN(@nXX) намного меньше   -  person Shnugo    schedule 01.04.2016
comment
В вашем вопросе есть только небольшая подсказка (трассировка стека), что вы используете Mono, а не Microsoft CLR. Если вы выполните поиск по mono sqlcommand index out of range, вы найдете довольно много совпадений, которые намекают на возможные проблемы с пулом соединений и / или потоками с реализацией классов SqlClient в Mono.   -  person Damien_The_Unbeliever    schedule 01.04.2016
comment
@Damien_The_Unbeliever Думаю, ты прав! Я только что ответил на свой вопрос, я собираюсь отредактировать свой вопрос, чтобы указать, что я использую MonoDevelop. Спасибо: D   -  person MetalxBeat    schedule 01.04.2016


Ответы (2)


Позвольте мне ответить на ваш вопрос: какова максимальная длина запроса SqlCommand ?.

Максимальный размер оператора составляет 65536 * размер сетевого пакета, который по умолчанию составляет около 1500 байт. Посчитайте - это около 90 МБ.

Однако превышение этого значения НЕ приведет к вашей ошибке. Но это вопрос, который вы задали.

person TomTom    schedule 01.04.2016
comment
это около 90 МБ - person Avrob; 23.02.2017

Я пытался найти предел, уменьшая количество обновляемых переменных, и нашел приятное место в длине команды SQL.

5 973 символа (без пробелов) 7 967 символов (с пробелами)

со 142 параметрами

Я думаю, что 8000 символов могут быть пределом в этом случае, но я не могу гарантировать это на 100%.

Забыл сказать, что использую MonoDevelop 5.9.6., Интегрированный в Unity3D. Другой пользователь (Damien_The_Unbeliever) дал мне понять, что это могут быть проблемы с пулом соединений и / или потоковой передачей с реализацией Mono классов SqlClient.

person MetalxBeat    schedule 01.04.2016
comment
Вы пытались использовать более короткие имена? 8000 очень близко к максимальной длине SQL Server VARCHAR (intValue). Не знаю особенностей Mono, но здесь может быть проблема с длиной строки ... Вы можете сохранить ~ 20 символов в 300 местах, стоит попробовать ... - person Shnugo; 01.04.2016
comment
Спасибо за совет! Ага, я это знаю. Дело в том, что я не могу сокращать имена переменных. Если бы я мог, я бы сделал это обязательно, но они должны оставаться такими, как есть. - person MetalxBeat; 04.04.2016
comment
@MetalxBeat То же самое случилось и со мной сейчас. Я думаю, что могу исправить, не передавая слишком много параметров; вместо этого используйте временную таблицу для логики скрипта - person FindOutIslamNow; 24.07.2017