7

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

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

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

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

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

ответ

6

SqlServer 2000 имеет предел запросов 4000 символов для AdHoc запросов.

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

+0

Вот чего я боялся. Да, я могу, проблема в том, что у меня нет управления над базой данных, что означает, что добавление sprocs и т. Д. Не под моим контролем. – 2008-12-03 00:20:38

+0

, который должен быть одним чертом запроса ... – JoshBerke 2008-12-03 00:28:53

+0

Конечно, мне нужно сделать некоторые серьезные манипуляции с столбцами ... так что динамически выполняйте операции LEFT, RIGHT, REPLACE на нескольких столбцах. – 2008-12-03 01:30:44

6

Вот мысль:

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

псевдокод:

SQLCommand command = new SqlCommand("exec sp_executeSQL @CMD"); 
command.Parameters.Add(new SqlParameter("@CMD",YourDynamicSQL, VARCHAR); 
+0

Это отличная идея и что-то я буду использовать, если я не могу получить запрос под 4K – 2008-12-03 01:28:37

-2

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

также - рассмотрите SP с его удобством в обслуживании, а также с помощью SQL-инъекции.

6

a необходимо читать для динамических запросов ... The Curse and Blessings of Dynamic SQL, я настоятельно рекомендую вам прочитать его. На этот раз вам не поможет, но это определенно поможет вам в будущем.

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

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

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

DECLARE @ SQL1 NVARCHAR (4000), @ SQL2 NVARCHAR (4000), @state символ (2) ВЫБРАТЬ @state = 'CA' ВЫБРАТЬ @ sql1 = N'SELECT COUNT (*) ' SELECT @ sql2 = N'FROM dbo.authors WHERE state = @state' EXEC ('EXEC sp_executesql N' '' + @ sql1 + @ sql2 + '' ', N '' @state char (2) '', @state = '' '+ @state +' '' ')

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

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

CREATE TABLE #RESULT (НСТ Int NOT NULL) DECLARE @ SQL1 NVARCHAR (4000), @ SQL2 NVARCHAR (4000), @state символ (2), @mycnt INT ВЫБРАТЬ @state = 'CA' ВЫБРАТЬ @ SQL1 = N'SELECT @cnt = COUNT (*)» ВЫБРАТЬ @ SQL2 = N'FROM dbo.authors WHERE state = @state ' INSERT #result (cnt) EXEC (' DECLARE @cnt int EXEC sp_executesql N '' '+ @ sql1 + @ sql2 +' '', N '' @ состояние символ (2), @cnt INT OUTPUT '', @state = '' '+ @state + ''', @cnt = @cnt ВЫХОД ВЫБОР @cnt ') ВЫБОР @ mycnt = cnt FROM #result

У вас есть мое понимание, если вы считаете, что это слишком грязно, чтобы стоить того.

2

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

2

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

Смежные вопросы