Выполнять очень длинные операторы в TSQL, используя sp_executesql - PullRequest
1 голос
/ 16 ноября 2011

Я хотел бы выполнить динамические операторы SQL длиной около 10 000 символов.

Когда я использую sp_executesql, как показано ниже:

DECLARE @stmt varchar(MAX)

SET @stmt = 'xxxxxxxx.................' which is about 10,000 characters

EXEC sp_executesql @stmt

Я получил следующую ошибку

The character string that starts with '  select t1.e_reference xxxxxxxxxxx' is too long. Maximum length is 8000. 

Насколько я знаю, мы можем использовать sp_executesql для выполнения очень длинных операторов, не так ли?

Я использую SQL Server 2008, Enterprise Edition, 64-разрядный.

Какмогу ли я достичь этого?Спасибо.

Ответы [ 3 ]

8 голосов
/ 10 декабря 2012

Исходя из ваших ответов в посте, вы используете linked server.Ограничение 8000 char определяется не sp_executesql, а OPENQUERY , которое вы, вероятно, используете в своей переменной @stmt.

MSDN говорит об этом OPENQUERY 's аргументы:

'query' Строка запроса, выполняемая на связанном сервере.Максимальная длина string составляет 8 КБ.

http://msdn.microsoft.com/en-us/library/ms188427.aspx

Чтобы обойти это, вы, вероятно, можете использовать

execute (@query) at oracle_linked_server
0 голосов
/ 26 сентября 2013

MSDN говорит, что это немного расплывчато: "Размер строки ограничен только доступной памятью сервера базы данных. На 64-разрядных серверах размер строки ограничен 2 ГБ, максимальный размер nvarchar (max)."

На 64-битных серверах ограничение составляет 2 ГБ. Непонятно, каково ограничение 32-битных серверов? Это 4000, 8000, какая бы память ни была доступна, 2 ГБ?

0 голосов
/ 16 ноября 2011

Параметр @stmt для sp_executesql имеет тип данных nvarchar (8000), поэтому вы превысили ограничение.

Либо реорганизуйте ваши операторы SQL в меньшие части, либо поместите SQL в хранимую процедуру.

...