Я могу использовать следующий код для маленьких запросов:
DECLARE @sql VARCHAR(8000)
SET @sql = 'SELECT * FROM myTable'
Exec @sql
Приведенный выше метод очень полезен для поддержания больших объемов кода, особенно когда нам нужно внести изменения один раз и чтобы они отражались везде.
Моя проблема в том, что мой запрос (это всего лишь один единственный запрос), который я хочу передать в переменную @sql, использует более 25 объединений таблиц, некоторые из них на временных табличных переменных, включает сложные операции, и поэтому его длина превышает 8000 символов.
Я хотел использовать тип данных TEXT для хранения этого запроса, но MSDN показывает предупреждение о том, что Microsoft планирует удалить типы данных Text, NText и Image из своих следующих версий. Я хочу, чтобы мой код работал и в будущем.
Я думал хранить этот запрос в отдельном файле, но поскольку в нем используются соединения с переменными таблицы и другие специфические для процедуры параметры, я сомневаюсь, что это возможно.
Подскажите, пожалуйста, способ хранения большого запроса в переменной и его многократного выполнения в процедуре.
Если то, что Вы пытаетесь выполнить, должно сделать это в Studio управления, сценарий ниже мог бы помочь.
DECLARE @Len INT = 5
DECLARE @Str VARCHAR(MAX) = '1111122222333334444455555'
DECLARE @TmpStr VARCHAR(MAX)
DECLARE @Return TABLE (RetStr VARCHAR(MAX))
WHILE(LEN(@Str) > 0)
BEGIN
SET @TmpStr = LEFT(@Str, @Len)
IF(LEN(@Str) > @Len)
SET @Str = RIGHT(@Str, LEN(@Str) - @Len)
ELSE
SET @Str = ''
INSERT INTO @Return SELECT @Str
END
SELECT * FROM @Return
Там @Len
должен быть 8000, поскольку это - максимальные шоу Studio управления длиной. @Str
текст, который является дольше, чем 8 000 символов.