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
@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