Каково ограничение длины запроса SqlCommand

Есть ли ограничение на длину запроса, который может обрабатывать SQL Server?

У меня есть обычный объект SqlCommand, и я передаю очень длинный оператор выбора в виде строки.

Запрос выглядит нормально при работе с механизмом SQL Server 2005/2008, но не выполняется с механизмом SQL Server 2000.

У меня нет подробностей об ошибках, поскольку у меня есть эта информация только из третьих рук, но мое приложение не работает должным образом. Я мог бы побеспокоиться об установке экземпляра SQL Server 2000, но мне просто интересно, есть ли у кого-нибудь быстрый способ. Да, в SQL Server 2000 есть ограничение в 4 КБ или 8 КБ, но не в типе ответа 2005 года.

Я знаю, что могу использовать хранимые процедуры, но предположим, что у меня есть веская причина их не использовать :-)


person Michael Prewecki    schedule 03.12.2008    source источник


Ответы (6)


SqlServer 2000 имеет ограничение в 4000 символов для специальных запросов.

Можете ли вы абстрагировать это в хранимую процедуру?

person FlySwat    schedule 03.12.2008
comment
Вот чего я боялся. Да, могу, проблема в том, что у меня нет управления базой данных, что означает, что добавление sprocs и т. д. не находится под моим контролем. - person Michael Prewecki; 03.12.2008
comment
Конечно, мне нужно выполнить некоторые серьезные манипуляции со столбцами... поэтому динамически выполняйте операции LEFT, RIGHT, REPLACE для нескольких столбцов. - person Michael Prewecki; 03.12.2008

Вот мысль:

VARCHAR SQLServer 2000 позволяет использовать до 8000 символов, поэтому это может работать:

PSевдокод:

SQLCommand command = new SqlCommand("exec sp_executeSQL @CMD");
command.Parameters.Add(new SqlParameter("@CMD",YourDynamicSQL, VARCHAR);
person FlySwat    schedule 03.12.2008
comment
Это отличная идея, и я воспользуюсь ею, если не смогу получить запрос ниже 4K. - person Michael Prewecki; 03.12.2008

необходимо прочитать для динамических запросов... Проклятие и благословения динамического SQL, я настоятельно рекомендую вам прочитайте это. В этот раз может не помочь, но в будущем обязательно поможет.

Цитата из статьи, на всякий случай.

sp_executesql и длинные строки SQL в SQL 2000

В SQL 2000 и SQL 7 существует ограничение, связанное с процедурой sp_executesql, поскольку вы не можете использовать более длинные строки SQL, чем 4000 символов. (В SQL 2005 и более поздних версиях вы должны использовать nvarchar(MAX), чтобы избежать этой проблемы.) Если вы хотите использовать sp_executesql, когда ваша строка запроса превышает этот предел, чтобы использовать параметризованные планы запросов, на самом деле существует обходной путь. Например, вы можете обернуть sp_executesql в EXEC():

DECLARE @sql1 nvarchar(4000), @sql2 nvarchar(4000), @state char(2) SELECT @state = 'CA' SELECT @sql1 = N'SELECT COUNT(*)' SELECT @sql2 = N'FROM dbo.authors ГДЕ состояние = @state' EXEC('EXEC sp_executesql N''' + @sql1 + @sql2 + ''', N''@state char(2)'', @state = ''' + @state + '' '')

Это работает, потому что параметр @stmt для sp_executesql имеет формат ntext, поэтому сам по себе он не имеет ограничений по размеру.

Вы даже можете использовать выходные параметры с помощью INSERT-EXEC, как в этом примере:

CREATE TABLE #result (cnt int NOT NULL) DECLARE @sql1 nvarchar(4000), @sql2 nvarchar(4000), @state char(2), @mycnt int SELECT @state = 'CA' SELECT @sql1 = N'SELECT @ cnt = COUNT(*)' SELECT @sql2 = N'FROM dbo.authors WHERE state = @state' INSERT #result (cnt) EXEC('DECLARE @cnt int EXEC sp_executesql N''' + @sql1 + @sql2 + ' '', N''@state char(2), @cnt int ВЫВОД'', @state = ''' + @state + ''', @cnt = @cnt ВЫВОД SELECT @cnt') SELECT @mycnt = cnt ОТ #результата

Я вас понимаю, если вы думаете, что это слишком грязно, чтобы оно того стоило.

person Alan Featherston    schedule 03.12.2008

Я столкнулся с ограничением в 2 КБ для запросов, выполняемых с AS/400. Обычно мне удавалось превысить лимит в 2 КБ, удалив все пробелы — это делает запрос нечитаемым, но это самый простой способ превысить лимит.

person Booji Boy    schedule 03.12.2008

На своем собственном опыте я обнаружил, что то, что сначала казалось ограничением SQLServer2000 на длину запросов, на самом деле (верите или нет) на самом деле не ограничение на длину запроса, а ограничение на длину любой заданной LINE в запросе.
Около года назад я столкнулся с этим, поэтому сразу не помню, какой была длина строки, но вы можете попробовать разбить огромный запрос в строки максимальной длины строки 64 КБ или около того, и посмотреть, как это пойдет. Насколько я помню, ограничение длины строки могло быть 64 КБ, хотите верьте, хотите нет. Я взял этот безумно длинный запрос (был сгенерирован программой-генератором sql), запрос был длиной около 80 КБ, и я разделил его пополам в Блокноте (т.е. я поместил перевод строки в код SQL примерно на полпути --- но я позаботился о том, чтобы не разделить ни одного слова), а затем вставил все это в командное окно Query Analyzer. Затем это сработало, имея перевод строки где-то посередине, в результате чего каждая из двух строк была длиной менее 64 КБ. Надеюсь, это поможет. Если нет, попробуйте использовать линии меньшей длины. Я уверен, что когда я довел свой запрос до точки, где ни одна строка в нем не превышала определенной длины, общий запрос сработал.

person Community    schedule 16.12.2008

Не делайте этого из-за sql-инъекций. Откажитесь от этого, если пользователь вообще может манипулировать динамическим sql приложения.

также - рассмотрите SP, поскольку его легче поддерживать, а также он помогает с внедрением sql.

person IEnumerator    schedule 03.12.2008
comment
Как я уже сказал, у меня нет контроля над базой данных. Но да, я знаю о возможности SQL-инъекций. Поскольку SQL Server сильно заблокирован, а приложение находится в закрытой сети, в настоящее время это не является важным фактором. - person Michael Prewecki; 03.12.2008
comment
О, и я дезинфицирую пользовательский ввод, но теперь вы никогда не можете быть уверены, не так ли? - person Michael Prewecki; 03.12.2008
comment
Я скрываюсь ... хех, динамический sql хорош, если вы параметризируете свои запросы ... (особенно если параметры исходят от пользователя) - person JoshBerke; 03.12.2008