sql-超出exec中的变量大小?
我继承了一些部分完成的sql代码,无法使用 它访问多个数据库,因此它首先使用用户ID号搜索适当的数据库,然后将该数据库名称插入到查询中。我对极度缩写的部分有个问题是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. )
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的数据的问题好的,你有一个概念证明,恭喜。我所知道的是,在我的情况下,这将不起作用,因为无论什么原因,我都会在列名称中间有错误的语法错误,我会在该列之前删除一些空白区域,并且该错误现在将在另一个列名上进一步降低。我有一个有效的解决方案,我完成了。争论这件事没有意义。谢谢你在这件事上的思考和智慧。