Varchar(Max)在Exec中不起作用

Pரத*_*ீப் 6 sql t-sql sql-server dynamic-sql varcharmax

我有一个存储在variable其中的SQL字符串并正在执行它exec()

Declare @sql varchar(max)

set @sql = Concat('select...',@var,'..') -- large string 

exec (@sql)
Run Code Online (Sandbox Code Playgroud)

但我得到错误说

sometext附近的语法不正确

这是因为变量@sql不能保存整个字符串.所以我修改了将字符串拆分为两个不同的变量并执行它

Declare @sql1 varchar(max),@sql2 varchar(max)

set @sql1 = 'select...' 
set @sql2 = ' from sometable join....'

exec (@sql1+@sql2)
Run Code Online (Sandbox Code Playgroud)

我检查了数据长度 @sql1+ @sql2

Select Datalength(@sql1+ @sql2)
Run Code Online (Sandbox Code Playgroud)

它回来了 14677

现在的问题是为什么varchar(max)不能存储14677信息字节?当文件说它可以存储2GB数据时

Shn*_*ugo 6

你可能正在反对:

DECLARE @part1 VARCHAR(5000)=REPLICATE('a',5000);
DECLARE @part2 VARCHAR(5000)=REPLICATE('a',5000);

SELECT DATALENGTH(@part1),DATALENGTH(@part2),DATALENGTH(@part1+@part2);
Run Code Online (Sandbox Code Playgroud)

其结果是5000,5000,8000

如果其中一个加数是一个MAX类型,你将得到预期的结果

SELECT DATALENGTH(@part1),DATALENGTH(@part2),DATALENGTH(CAST(@part1 AS VARCHAR(MAX))+@part2);
Run Code Online (Sandbox Code Playgroud)

其结果是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));
Run Code Online (Sandbox Code Playgroud)