Есть ли ограничение на длину запроса, который может обработать SQL Server?
У меня есть обычный объект SqlCommand, и я передаю очень длинный оператор выбора в виде строки.
Запрос кажется правильным при работе с ядром SQL Server 2005/2008, но не выполняется с ядром SQL Server 2000.
У меня нет сведений об ошибке, поскольку эта информация есть у меня только третьими лицами, но мое приложение работает не так, как ожидалось. Я мог бы заняться установкой экземпляра SQL Server 2000, но мне просто было интересно, есть ли у кого-нибудь быстрая установка. Да, в SQL Server 2000 есть ограничение 4K или 8K, но не в ответе типа 2005.
Я знаю, что могу использовать хранимые процедуры, но предположим, что у меня есть веская причина не использовать их :-)





SqlServer 2000 имеет ограничение в 4000 символов для специальных запросов.
Можете ли вы абстрагировать это в хранимую процедуру?
Конечно, мне нужно проделать серьезные манипуляции с столбцами ... поэтому динамически выполняйте операции LEFT, RIGHT, REPLACE для нескольких столбцов.
Вот такая мысль:
VARCHAR SQLServer 2000 позволяет использовать до 8000 символов, поэтому это может сработать:
PSeudoCode:
SQLCommand command = new SqlCommand("exec sp_executeSQL @CMD");
command.Parameters.Add(new SqlParameter("@CMD",YourDynamicSQL, VARCHAR);
Это отличная идея, и я воспользуюсь ею, если не получу запрос в разрешении 4K.
Не делать этого из-за sql-инъекций. Откажитесь от этого, если пользователь может вообще управлять динамическим sql приложения.
также - рассмотрите SP, поскольку его легче поддерживать, а также он помогает с внедрением sql.
Как я уже сказал, у меня нет контроля над базой данных. Но да, я знаю о потенциале SQL-инъекций. Поскольку SQL Server очень заблокирован, а приложение находится в закрытой сети, в настоящее время это не является серьезным вопросом.
Да, и я дезинфицирую пользовательский ввод, но теперь вы никогда не можете быть уверены в этом.
Я скрываюсь ... хех динамический sql хорош, если вы параметризуете свои запросы ... (особенно если параметры вводятся пользователем)
необходимо прочитать для динамических запросов ... Проклятие и благословение динамического SQL, я настоятельно рекомендую вам прочитать это. В этот раз не поможет, но в будущем обязательно поможет.
Цитата из статьи, на всякий случай.
sp_executesql and Long SQL Strings in SQL 2000
There is a limitation with sp_executesql on SQL 2000 and SQL 7, since you cannot use longer SQL strings than 4000 characters. (On SQL 2005 and later, you should use nvarchar(MAX) to avoid this problem.) If you want to use sp_executesql when your query string exceeds this limit to make use of parameterised query plans, there is actually a workaround. To wit, you can wrap sp_executesql in 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 + '''')
This works, because the @stmt parameter to sp_executesql is ntext, so by itself, it does not have any limitation in size.
You can even use output parameters by using INSERT-EXEC, as in this example:
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 OUTPUT'', @state = ''' + @state + ''', @cnt = @cnt OUTPUT SELECT @cnt') SELECT @mycnt = cnt FROM #result
You have my understanding if you think this is too messy to be worth it.
Я столкнулся с лимитом в 2 КБ для запросов, выполняемых в AS / 400. Обычно мне удавалось достичь ограничения в 2 КБ, удалив все пробелы - это делает запрос нечитаемым, но это самый простой способ выйти за пределы лимита.
На собственном опыте я обнаружил, что то, что сначала казалось ограничением SQLServer2000 на длину запросов, на самом деле (хотите верьте, хотите нет) на самом деле не является ограничением длины запроса, но является ограничением длины любой данной СТРОКИ в запросе. Примерно год назад я столкнулся с этим, поэтому я не помню, какая была длина строки, но вы могли попробовать разбить огромный запрос на строки с максимальной длиной строки 64 КБ или около того, и посмотрим, как получится. Насколько я помню, ограничение на длину строки могло быть 64 КБ, хотите верьте, хотите нет. Я взял этот безумно длинный запрос (был сгенерирован программой sql-генератора), длина запроса составляла около 80 КБ, и я разделил его пополам в Блокноте (т.е. я поместил перевод строки в код SQL примерно на полпути). --- но я позаботился о том, чтобы не разбивать слова), а затем вставил все это в командное окно Query Analyzer. Затем это сработало: перевод строки был где-то посередине, что привело к тому, что каждая из двух строк была меньше 64 КБ. Надеюсь, это поможет. Если нет, попробуйте меньшую длину строки. Я уверен, что когда я получил свой запрос до такой степени, что ни одна строка в нем не превышала определенной длины, общий запрос работал.
Вот чего я боялся. Да, я могу, проблема в том, что у меня нет управления базой данных, что означает, что добавление sprocs и т. д. Не находится под моим контролем.