Как запустить оператор SQL длиной более 8000 символов из переменной? - PullRequest
20 голосов
/ 07 февраля 2012

Я могу использовать следующий код для крошечных маленьких запросов:

DECLARE @sql VARCHAR(8000)
SET @sql = 'SELECT * FROM myTable'
Exec @sql

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

Моя проблема в том, что мой запрос (это всего лишь один запрос), который я хочу передать в переменную @sql, использует более 25 объединений таблиц, некоторые из них во временных переменных таблицы, включают сложные операции иследовательно, его длина превышает 8000 символов.

Я хотел бы использовать тип данных TEXT для хранения этого запроса, но MSDN показывает предупреждающее сообщение о том, что Microsoft планирует удалить типы данных Text, NText и Image из следующих версий.,Я хотел бы, чтобы мой код работал и в будущем.

Я думал о сохранении этого запроса в отдельном файле, но, поскольку он использует объединения переменных таблицы и других параметров, специфичных для процедуры, я сомневаюсь, что это возможно.

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

Ответы [ 12 ]

0 голосов
/ 09 мая 2018

У меня возникла та же проблема с усеченными строками. Я узнал, что вы можете выполнить инструкцию sp_executesql несколько раз.

Поскольку мой блок кода превышал предел 4k / Max, я разбил его на маленькие кусочки, подобные этому:

set @statement = '                                                                                      
update pd                               
set pd.mismatchtype = 4                             
  FROM [E].[dbo].[' + @monthName + '_P_Data] pd                             
  WHERE pd.mismatchtype is null '                                                                               
exec sp_executesql @statement                               


set @statement = 'Select * from xxxxxxx'
exec sp_executesql @statement

set @statement = 'Select * from yyyyyyy '
exec sp_executesql @statement

end

Таким образом, каждый набор @Statement может иметь varchar (макс.), Если каждый чанк находится в пределах размера (я вырезал реальный код в моем примере, из соображений экономии места)

0 голосов
/ 23 марта 2017
ALTER PROCEDURE [dbo].[spGetEmails]
AS
BEGIN
    SET NOCOUNT ON;
    -- Insert statements for procedure here

    declare @p varbinary(max)
set @p = 0x
declare @local table (col text)

SELECT   @p = @p + 0x3B + CONVERT(varbinary(100), Email)
 FROM tbCarsList
 where email <> ''
 group by email
 order by email

 set @p = substring(@p, 2, 10000000)

 insert @local values(cast(@p as varchar(max)))
 select   col from @local


END
...