sp_execute не поддерживает динамический запрос SQL с длиной более 4000 символов - PullRequest
0 голосов
/ 21 ноября 2018

Я использую оператор sp_execute для выполнения динамического SQL-запроса.

Но sp_execute не поддерживает динамический SQL-запрос с более чем 4000 символов.

Работает нормально соднако заявление EXEC.

Пожалуйста, предложите, если у вас есть какое-либо решение.

Это мой код:

declare @a nvarchar(max), @b nvarchar(max), @c nvarchar(max), @d nvarchar(max)

select @d = 'a'
select @a = 'select top 1 name,''', @b = replicate(@d, 10000),
       @c=''' from sysobjects'

SELECT LEN(@a + @b + @c)

DECLARE @s NVARCHAR(max) = @a + @b + @c

EXEC sp_execute @s
EXEC(@s)

Ответы [ 2 ]

0 голосов
/ 21 ноября 2018

Используйте sp_executesql вместо sp_execute.

declare @a nvarchar(max), @b nvarchar(max), @c nvarchar(max), @d nvarchar(max)

select @d = 'a'
select @a = 'select top 1 name,''', @b = replicate(@d, 10000),
       @c=''' from sysobjects'

SELECT LEN(@a + @b + @c)

DECLARE @s NVARCHAR(max) = @a + @b + @c

EXEC sp_executesql @s
EXEC(@s)
0 голосов
/ 21 ноября 2018

Вы должны использовать sp_executesql.Поддерживает nvarchar (max).Вы можете сослаться на здесь

Но ваша проблема не столько в sp_execute, сколько в строке @b.Если вы заметили, следующий запрос дает len 8036, а не 10036

SELECT len(@a+@b+@c)

Преступник @b=replicate('a',10000) максимальная длина при 8000. Replicate возвращает тот же тип данных a, что varchar

если вы приведете или преобразуете () строку a в nvarchar (max), она даст вам 1000 символов

@b = replicate(convert(nvarchar(max), 'a'),10000)

, или вы также можете попробовать это

declare @d nvarchar(max)

select @d = 'a'
select @b = replicate(@d, 10000)
select len(@b)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...