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数据时
你可能正在反对:
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)前最大长度CONCATSELECT 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)