使用sp_executesql在TSQL中执行非常长的语句



我想执行大约10,000个字符的动态SQL语句。

当我像下面这样使用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,企业版,64位。

我怎样才能做到这一点?谢谢。

根据您在帖子中的回复,您正在使用linked server。8000 char限制不是由sp_executesql提出的,而是由OPENQUERY提出的,您可能会在变量@stmt中使用。

MSDN表示OPENQUERY的参数:

' query '是在链接服务器上执行的查询字符串。的最大string的长度为8 KB。

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

要绕过这个,您可以使用

execute (@query) at oracle_linked_server

MSDN说这是有点模糊:"字符串的大小仅受可用数据库服务器内存的限制。在64位服务器上,字符串的大小限制为2gb,最大大小为nvarchar(max)。"

在64位服务器上,限制是2GB。目前还不清楚32位服务器的限制是什么?是4000,8000,还是2GB?

将代码分割成小于4k字符的字符串,然后用双引号替换单引号,最后执行如下。

SET @STM1 = REPLACE( @STM1, CHAR(39), CHAR(39) + CHAR(39);
SET @STM2 = REPLACE( @STM2, CHAR(39), CHAR(39) + CHAR(39); 
SET @STM3 = REPLACE( @STM3, CHAR(39), CHAR(39) + CHAR(39);
EXECUTE( N'EXECUTE sp_executesql N''' + @STM1 + N' ' + @STM2 + N' ' + @STM3 + '''' );

sp_executesql的@stmt参数的数据类型是nvarchar(8000),所以您已经超过了限制。

要么将SQL语句重构为更小的部分,要么将SQL放入存储过程中。

相关内容

  • 没有找到相关文章

最新更新