摘要:MSSQL varchar(8000)问题
-----------MS SQL LOB 变量
---经实验即使是用varchar(max)也无法用单一指定超过8000位
declare@max varchar(max)
set@max=replicate('A',9000)
selectlen(@max) --8000
,datalength(@max)--8000
--要超过需用"结合"的方式
declare@max varchar(max)
set@max=replicate('A',9000)--8000
set@Max=@MAX+replicate('B',8000)
selectlen(@max) --16000
,datalength(@max)--16000
-----状况
DECLARE@qry VARCHAR(MAX), @qry1 VARCHAR(8000), @qry2 VARCHAR(8000)
SELECT @qry1 = REPLICATE('a', 5000),
@qry2 = REPLICATE('b', 5000)
SELECT@qry = @qry1 + @qry2
SELECTLEN(@qry), --8000=>竟不是10000??
LEN(@qry1),--5000
LEN(@qry2) --5000
--如何修正
SELECT@qry = CAST(@qry1 AS VARCHAR(MAX)) + CAST(@qry2 AS VARCHAR(max))--把qry1、qry2转换成varchar(max),其实只要qry1 或qry2 中有一个是varchar(max)即可弄出正确结果
SELECTLEN(@qry),--10000
LEN(@qry1),--5000
LEN(@qry2) --5000
---在2005的sp中
alter proc #C
@i varchar(max) output
as
set@i=replicate('A',8000)
set@i=@i+replicate('B',8000)
selectlen(@i)
GO
--PS:text、ntext 以及image 数据类型对本机变量(local variable)而言无效。
declare@k varchar(max),
@i varchar(max)
set@i=replicate('C',10000)--单一指定即使是(max) 最多也只8000
exec#c @k output
set@i=@k+@i
selectlen(@k),--16000
len(@i) --24000
/*
在2000的sp中 用text输出似乎会有以下问题
- 无法替text类型的输出参数指定值=>error:The assignment operator operation cannot take a text data type as an argument.
- text与varchar 无法结合(+)
3、若想以多个text值结合来突破8000的限制 =>error:Invalid operator for data type. Operator equals add, type equals text:add 操作符的算子数据类型text 无效。
*/