我有一个variable
,其中存储了SQL
个字符串,并通过exec()
Declare @sql varchar(max)
set @sql = Concat('select...',@var,'..') -- large string
exec (@sql)
但是收到错误说
sometext
附近的语法不正确
这是因为变量@sql
无法保存整个字符串。所以我通过将字符串拆分为两个不同的变量并执行它来修复
Declare @sql1 varchar(max),@sql2 varchar(max)
set @sql1 = 'select...'
set @sql2 = ' from sometable join....'
exec (@sql1+@sql2)
我检查了@sql1+ @sql2
Select Datalength(@sql1+ @sql2)
它返回14677
现在问题是为什么varchar(max)
无法存储14677
个字节的信息?当文档说它可以存储最多2GB
个数据
答案 0 :(得分:6)
可能是你正在反对:
DECLARE @part1 VARCHAR(5000)=REPLICATE('a',5000);
DECLARE @part2 VARCHAR(5000)=REPLICATE('a',5000);
SELECT DATALENGTH(@part1),DATALENGTH(@part2),DATALENGTH(@part1+@part2);
结果是5000,5000, 8000
如果其中一个加数是MAX
类型,您将获得预期结果
SELECT DATALENGTH(@part1),DATALENGTH(@part2),DATALENGTH(CAST(@part1 AS VARCHAR(MAX))+@part2);
结果是5000,5000, 10000
这通常与
有关VARCHAR(8000)
作为前最大长度CONCAT
SELECT DATALENGTH(@part1),DATALENGTH(@part2),DATALENGTH(CONCAT(@part1,@part2));
SELECT DATALENGTH(@part1),DATALENGTH(@part2),DATALENGTH(CONCAT(CAST(@part1 AS VARCHAR(MAX)),@part2));
答案 1 :(得分:0)
创建两个varchar(max)数据元素并通过“ exec(@ sql1 + @ sql2)”将它们组合的方法很有效,我对此建议表示赞赏。我遇到了同样的问题,将来会使用此技巧。
对我来说,一个varchar(max)数据元素在尝试执行时被截断了。将其拆分为两个varchar(max)数据元素(不更改语法),然后执行即可。