經常我們要用到大量操作時都會用到字串的拆分,鬱悶的是SQL Server中卻沒有內建Split函數,所以我們只能自己動手來解決一下。為了減少和資料庫的通訊次數,我們都會利用這種方法來實現大量操作。當然有時我們會藉助Execute這個方法來實現,利用這個方法有一個不好的地方就是她只認識以","分割的字串,在傳IDs大量操作的時候還是可以達到目的,但是經常我們要用到更複雜的操作時我們就需要自己動手來完成了......
1.當我們需要傳入很長的字串是我們可以藉助NText和Text類型,他們的區別是一個是支援Unicode,一個是支援ANSI字元集的。需要注意的是當我們要計算字串長度時我們需要用到DATALENGTH()而不是LEN(),在NText類型中一個字元佔兩個位元組,所以在計算字元時別忘了除以2,下面我們先看下例子就能夠說明一切了。
-- =============================================
-- Author: <myxbing>
-- Create date: <2007/8/17>
-- Description: <拆分字串函數>
-- =============================================
CREATE FUNCTION [dbo].[Split]
(
@SplitString text, -- 如果要傳入NText類型,下面需要相應的修改,注釋行為NText下同
@Separator varchar(2) = ','-- NVarChar(2) = N','
)
RETURNS @SplitStringsTable TABLE
(
[id] int identity(1,1),
[value] varchar(8000) -- NVarChar(4000)
)
AS
BEGIN
DECLARE @CurrentIndex int;
DECLARE @NextIndex int;
DECLARE @ReturnText varchar(8000);-- NVarChar(4000)
SELECT @CurrentIndex=1;
WHILE(@CurrentIndex<=datalength(@SplitString)) -- DATALENGTH(@SplitString)/2
BEGIN
SELECT @NextIndex=charindex(@Separator,@SplitString,@CurrentIndex);
IF(@NextIndex=0 OR @NextIndex IS NULL)
SELECT @NextIndex=datalength(@SplitString)+1;--DATALENGTH(@SplitString)/2
SELECT @ReturnText=substring(@SplitString,@CurrentIndex,@NextIndex-@CurrentIndex);
INSERT INTO @SplitStringsTable([value])
VALUES(@ReturnText);
SELECT @CurrentIndex=@NextIndex+1;
END
RETURN;
END
有時我們拆分出來還是需要很長的字串有可能超過(N)VarChar的長度,當然為了相容SQL Server2000不能用max,所以我們拆出的字串還是要用(N)Text來表示,需要注意的是在局部變數中不能定義(N)Text的類型,不過我們可以把substring出來的字串直接加入到表變數中,而不要付值後在Insert。