EXEC sp_executesql @sql ограничение - PullRequest
0 голосов
/ 04 марта 2019

У меня проблемы с выполнением динамического кода SQL Server.

У меня есть вставка во временную таблицу, и число символов превышает 4000. Я попытался разделить на две переменные, а затем объединил их, но проблема

EXEC sp_executesql @sql, 
                   N'@DimStartDate int, @DimEndDate bigint',
                   @DimStartDate, @DimEndDate;

Я обнаружил в сети, что EXEC(@sql1+@sql2) - это решение, но мне действительно нужны входные параметры.Как я могу решить это?

Ответы [ 3 ]

0 голосов
/ 04 марта 2019

У меня не было проблем с sp_executesql на очень длинных строках.Вам просто нужно объявить запрос достаточно длинным:

declare @sql nvarchar(max);

При вставке в таблицу может возникнуть ошибка, если длина строки слишком длинна для таблицы.Это не имеет ничего общего с динамическим утверждением.Максимальная длина строки ограничена в SQL Server - хотя вы можете использовать длинные строки и большие двоичные объекты, чтобы обойти это.

0 голосов
/ 04 марта 2019

Не уверен, где именно проблема.SQL Server с радостью выполнит более 4000 символов, поэтому ваш SQL должен быть обрезан где-то еще.Вот пример, где я вручную создал пакет, который содержит более 4000 символов, так что вы можете видеть, что все три оператора SELECT выполняются, и если вы скопируете и вставите средний результат, вы увидите, что у уконец:

DECLARE @sql nvarchar(max) = N'SELECT 1;'
  + N'SELECT ''' + CONVERT(nvarchar(max), REPLICATE('x', 4096)) + N'y'';';
  + N'SELECT 2;';

EXEC sys.sp_executesql @sql;

Результаты:

enter image description here

0 голосов
/ 04 марта 2019

Ранее я уже сталкивался с подобной проблемой, как показано ниже.По сути, вам нужно разделить ваш основной запрос на части, затем объединить их в конце и использовать sp_EXECUTESQL для запуска динамического запроса.

DECLARE @SQL_Part1 varchar(4000);       
DECLARE @SQL_Part2 varchar(4000);
DECLARE @SQL_Part3 varchar(4000);
DECLARE @SQL_Part4 varchar(4000);
DECLARE @SQL_Part5 varchar(4000);
DECLARE @SQL_FullQuery nvarchar(MAX);

.. set your queries...

SET @SQL_FullQuery = CAST(@SQL_Part1 + @SQL_Part2 + @SQL_Part3 + @SQL_Part4 + @SQL_Part5 as nvarchar(MAX));
EXEC sp_EXECUTESQL @SQL_FullQuery;
...