經常我們要用到批量操作時都會用到字符串的拆分,郁悶的是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。