Varchar(Max) 在 Exec 中不工作
Varchar(Max) is not working in Exec
我有一个 variable
,其中存储了 SQL
字符串,我正在通过 exec()
执行它
Declare @sql varchar(max)
set @sql = Concat('select...',@var,'..') -- large string
exec (@sql)
但我收到错误提示
Incorrect syntax near 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
数据
这可能是你运行反对的:
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));
创建两个 varchar(max) 数据元素并通过 "exec (@sql1+@sql2)" 组合它们的方法有效,我很欣赏这个建议。我 运行 遇到了同样的问题,将来会使用这个技巧。
对我来说,一个 varchar(max) 数据元素在尝试执行时被截断了。将其拆分为两个 varchar(max) 数据元素(无语法更改)并无问题地执行。
我有一个 variable
,其中存储了 SQL
字符串,我正在通过 exec()
Declare @sql varchar(max)
set @sql = Concat('select...',@var,'..') -- large string
exec (@sql)
但我收到错误提示
Incorrect syntax near 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
数据
这可能是你运行反对的:
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));
创建两个 varchar(max) 数据元素并通过 "exec (@sql1+@sql2)" 组合它们的方法有效,我很欣赏这个建议。我 运行 遇到了同样的问题,将来会使用这个技巧。
对我来说,一个 varchar(max) 数据元素在尝试执行时被截断了。将其拆分为两个 varchar(max) 数据元素(无语法更改)并无问题地执行。