我想执行大约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的参数:
http://msdn.microsoft.com/en-us/library/ms188427.aspx'
query
'是在链接服务器上执行的查询字符串。的最大string
的长度为8 KB。
要绕过这个,您可以使用
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放入存储过程中。