摘要: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 無效。
*/