varchar(MAX)--SQL2005的增強特性

varchar(MAX)--SQL2005的增強特性
2010-08-03 15:18

先說個問題:

看這樣一個很簡單的存儲過程,接收有一個text類型的參數。

CREATE PROCEDURE pr_testprocedure
(    
    
@text text
)
AS
BEGIN

   
SELECT @text

END

在SQL 中調用

DECLARE @largeText VARCHAR(8000)

SET @largeText ='very large string more than 8000 '

EXEC pr_testprocedure @text = @largeText

大家知道,在SQL Server 2000中,VARCHAR的最大長度是8000,如果字符串的長度超過8000,保存在VARCHAR中時就會被截斷。如果你需要傳入的參數恰好很長,比如是一個xml,很多時候都會超過8000個字符。那怎麼辦呢?

DECLARE @largeText TEXT 是不行的,那我們怎麼辦呢?

在SQL Server 2000中,這的確是個很棘手的問題。不過幸運的是SQL Server 2005爲我們提供了VARCHAR(MAX),它的最大長度可以達到2G,足夠用了:)。而且,我們原先熟悉的字符串處理函數REPLACE,LTRIM等等也可以用了,多完美啊,呵呵

VARCHAR(MAX), NVARCHAR(MAX)和VARBINARY(MAX)是SQL Server 2005中引進的,可以作爲TEXT, NTEXT和IMAGE的替代。

做個試驗:

declare @smallVarChar varchar(1)
set @smallVarChar = '*'
select datalength(replicate(@smallVarChar, 8001)) as LengthOfSmallVarChar
go

LengthOfSmallVarChar

--------------------

8000

declare @maxVarChar varchar(max)
set @maxVarChar = '*'
select datalength(replicate(@maxVarChar, 8001)) as LengthOfMaxVarChar
go

LengthOfMaxVarChar

--------------------

8001

嗯,上面存儲過程的難題也迎刃而解了:

DECLARE @largeText VARCHAR(MAX)

SET @largeText ='very large string more than 8000 '

EXEC pr_testprocedure @text = @largeText

Perfect!!

不過還有一點是要注意的,VARCHAR和VARCHAR(MAX)混在一起做處理時還是會變成VARCHAR,從而可能被截斷,所以需要全轉成VARCHAR(MAX)

比如:
declare @str1 varchar(2)

set @str1 = '*'

declare @maxVarChar varchar(max)
set @maxVarChar = '*'
select datalength(replicate(@maxVarChar, 7999) + @str1 ) as LengthOfMaxVarChar
go

結果會是怎麼樣呢?其實還是8000,但如果改成declare @str1 varchar(max)就對了。


發佈了100 篇原創文章 · 獲贊 6 · 訪問量 47萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章