sql-超出exec中的变量大小?

sql-超出exec中的变量大小?,sql,sql-server,sql-server-2005,tsql,Sql,Sql Server,Sql Server 2005,Tsql,我继承了一些部分完成的sql代码,无法使用 它访问多个数据库,因此它首先使用用户ID号搜索适当的数据库,然后将该数据库名称插入到查询中。我对极度缩写的部分有个问题是 DECLARE @sql AS VARCHAR(8000) SET @sql = 'INSERT INTO ['+@DatabaseName+'].dbo.[customer] ( -- containing about 200 columns. )

我继承了一些部分完成的sql代码,无法使用

它访问多个数据库,因此它首先使用用户ID号搜索适当的数据库,然后将该数据库名称插入到查询中。我对极度缩写的部分有个问题是

DECLARE @sql AS VARCHAR(8000)  
    SET @sql = 'INSERT INTO ['+@DatabaseName+'].dbo.[customer]  
                  ( -- containing about 200 columns. )  
                VALUES(...)'  
PRINT @sql  
EXEC(@sql)
我会在列名中间得到错误,有时会说它需要括号或引号。我开始删除空白,即,[名字],[姓氏]在同一行,而不是两行,这将使我的查询更深入一些。我没有太多的空白可以删除,我只是进入值。。。一部分。奇怪的是。我复制并粘贴了列部分,并将其放入Word中,结果显示只有大约3000个字符,包括空格

我错过什么了吗? 如果有什么意义的话,我正在运行MicrosoftSQLServer2005,并使用SQLServerManagementStudio进行编辑


谢谢

为@sql使用nvarcharmax数据类型。

请参见此处:以获取一些解决方案

极其简略

好吧,这并没有真正的帮助,因为你可能已经缩短了问题的原因

如果我猜的话,我见过涉及NCHAR或CHAR变量/列的情况。当用于字符串连接时,这些语句会扩展到其完整长度,这将导致final语句过长

无论风格如何,请始终为SQL Server 2005及以后版本使用NVarcharMax。事实上,如果您使用sp_executesql,这就是预期的类型

如果您检查固定宽度的N/CHAR列并切换到nvarcharmax,您可能会看到问题消失了

编辑:测试显示NVarcharMax保存良好,超过8000字节

declare @sql nvarchar(max)

-- this CTE sets up the columns, 1 as field1, 2 as field2 etc
-- it creates 2000 columns
;with CTE(n, t) AS (
    select 1, convert(nvarchar(max),'1 as field1')
    union all
    select n+1, convert(nvarchar(max),RIGHT(n, 12) + ' as field'+RIGHT(n, 12))
    from cte
    where N < 2000)
select @sql = coalesce(@sql+',','') + t
from CTE
option (maxrecursion 2000)   -- needed, the default of 100 is not nearly enough

-- add the SELECT bit to make a proper SQL statement
set @sql = 'select ' + @sql

-- check the length : 33786
select LEN(@sql)

-- check the content
print @sql

-- execute to get the columns
exec (@sql)

我错过什么了吗?适当资本化;Nvarcharmax只有4000个字符,内存限制相同,但使用unicode字符,而常规varcharmax只有8000个字符。我的威胁是对的。您的变量不能保存查询的所有字符,因此在中间被截断。当它打印出来时,你应该看到这一点,你没有看到这种行为吗?@GluedHands-你看到的更有可能是打印输出被截断,而不是nvarcharmax的任何限制!如果有足够的内存,它可以保存2GB的数据。每个nchar字符是2个字节,你做数学!在你的链接中有一个关于如何将查询分成几个部分的部分,其中一些是我的解决方案。创建了一个@sql1@sql2和@sql3作为varcharmax,然后分解了插入。。。和价值。。。在这三个国家中,。最后打印了@sql1+@sql2+@sql3,然后是一个exec@sql1++@sql2++@sql3来执行它。谢谢SQLMenance,很抱歉我没有早点看到这个。从SQLMenance给我的链接,我分割了插入。。。价值观转换为3个最大大小的变量,并从那里执行它。虽然在我达到值之前就遇到了这个问题…,但是只有带有carrage返回的表列和一些间距太大,无法容纳最大大小的单个sql变量。您确定吗?太多,无法容纳最大大小的单个sql变量。您的sql查询的数据长度超过2 GB?最大大小是指varcharmax,对吗?最大大小的sql变量。。。瓦查马克斯,对吗-是的,变量,不是查询。列名列表本身太长,无法容纳一个变量,因此我首先尝试删除空格,发现我超出了该变量的大小限制。@dave在编辑的答案中对测试有何评论?我从来没有遇到过nvarcharmax不能保存任何小于2GB的数据的问题好的,你有一个概念证明,恭喜。我所知道的是,在我的情况下,这将不起作用,因为无论什么原因,我都会在列名称中间有错误的语法错误,我会在该列之前删除一些空白区域,并且该错误现在将在另一个列名上进一步降低。我有一个有效的解决方案,我完成了。争论这件事没有意义。谢谢你在这件事上的思考和智慧。