2007年11月22日星期四

SqlServer2005,拆分一组按特定分隔符排列字符串函数(表值函数)

今天做项目时有需要用到SqlServer拆分字串的函数,懒得自己写就在网上找了一下,找到这个,后来测试时发现两个问题:最后一组值取不到,连续的两个分隔符返回空值或 0。很显然这个函数不能用。

其拆分的原理是:从第一个字符或分隔符的下一个字符开始,查找下一个分隔符,然后取出其中的值并插入到一个临时表,最后返回这个临时表。这时候有2个需要注意的地方:需拆分字串的最后一个字符并不一定是分隔符,所以需要判断;两个分隔符之间的值为空时需要跳过。

修改后的代码如下:

CREATE FUNCTION fn_Splitor (
    
@array nvarchar(4000),
    
@separator char=','
)
RETURNS @tbls TABLE (Item int)
as
BEGIN
    
if(@array is null or len(ltrim(rtrim(@array)))=0)
        
return;

    
DECLARE @item nvarchar(4000)
    
DECLARE @cur  int
    
DECLARE @pos int
    
DECLARE @len  int    --字符串的长度
    set @cur=1

    
SET @len=len(@array)
    
WHILE (@cur<=@len)
    
BEGIN
        
set @pos=CharIndex(@separator,@array,@cur)
        
-- 如果有连续两个分隔符@separator,则跳过此次循环
        if(@pos=@cur)
        
begin
            
set @cur=@cur+1
            
continue
        
end
        
if(@pos>0)
       
    begin
               
set @item=SUBSTRING(@array,@cur,@pos-@cur)
                set @cur=@pos+1
           
end
        
else
           
begin
               
-- 循环已到了@array的末尾,在末尾并不包含分隔符@separator。
                set @item=SUBSTRING(@array,@cur,@len-@cur+1)
               
set @cur=@len+1
           
end
        INSERT INTO @tbls VALUES(@item)
    
END
    
RETURN
end
GO