6

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

4

2 回答 2

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));
于 2016-11-02T10:14:44.707 回答
0

创建两个 varchar(max) 数据元素并通过“exec (@sql1+@sql2)”组合它们的方法有效,我很欣赏这个建议。我遇到了同样的问题,将来会使用这个技巧。

对我来说,一个 varchar(max) 数据元素在尝试执行时被截断。将其拆分为两个 varchar(max) 数据元素(不更改语法)并毫无问题地执行。

于 2018-11-28T15:38:17.670 回答