Varchar(Max)在Exec中不起作用

时间:2016-11-02 10:02:18

标签: sql sql-server tsql dynamic-sql varcharmax

我有一个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个数据

2 个答案:

答案 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)数据元素(不更改语法),然后执行即可。