Каково ограничение в длине запроса SqlCommand? - PullRequest
7 голосов
/ 03 декабря 2008

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

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

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

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

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

Ответы [ 6 ]

6 голосов
/ 03 декабря 2008

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

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

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

Существует ограничение с sp_executesql для SQL 2000 и SQL 7, поскольку вы не можете использовать более длинные строки 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 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 (cnt int NOT NULL) ЗАЯВИТЬ @ 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 ('ОБЪЯВЛЯЙТЕ @cnt int EXEC sp_executesql N '' '+ @ sql1 + @ sql2 +' '', N '' @ state char (2), @cnt int OUTPUT '', @state = '' '+ @state +' '', @cnt = @cnt ВЫХОД SELECT @cnt ') SELECT @mycnt = cnt FROM # result

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

6 голосов
/ 03 декабря 2008

Вот мысль:

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

псевдокод:

SQLCommand command = new SqlCommand("exec sp_executeSQL @CMD");
command.Parameters.Add(new SqlParameter("@CMD",YourDynamicSQL, VARCHAR);
6 голосов
/ 03 декабря 2008

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

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

2 голосов
/ 16 декабря 2008

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

2 голосов
/ 03 декабря 2008

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

0 голосов
/ 03 декабря 2008

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

также - рассмотрите SP, так как его легче поддерживать, и это также помогает с инъекцией SQL.

...