Sql字符串分组Split函数的两种实现方法

在给文章加自定义标签时,需要在存储过程中对输入的字符串按照“,”字符分割成一个字符数组。但是Sql中没有实现字符串分组的Split方 法。因此就需要编写一个自定义的Split函数。我首先是使用表值函数的方法实现的字符串分组,但是在使用中感觉不是很方便。后来又在网上找到了一种使用 两个标量函数,其中一个函数首先返回分割后字符数组的长度,另一个函数依次返回每个分割出的字符串。然后使用循环依次获取分割的字符。

表值函数实现Split方法

 1  Create  FUNCTION  [ dbo ] . [ SplitToTable ]
 2  (
 3       @SplitString  nvarchar ( max ),
 4       @Separator  nvarchar ( 10 ) = '  '
 5  )
 6  RETURNS  @SplitStringsTable  TABLE
 7  (
 8  [ id ]  int  identity ( 1 , 1 ),
 9  [ value ]  nvarchar ( max )
10  )
11  AS
12  BEGIN
13       DECLARE  @CurrentIndex  int ;
14       DECLARE  @NextIndex  int ;
15       DECLARE  @ReturnText  nvarchar ( max );
16       SELECT  @CurrentIndex = 1 ;
17       WHILE ( @CurrentIndex <= len ( @SplitString ))
18           BEGIN
19               SELECT  @NextIndex = charindex ( @Separator , @SplitString , @CurrentIndex );
20               IF ( @NextIndex = 0  OR  @NextIndex  IS  NULL )
21                   SELECT  @NextIndex = len ( @SplitString ) + 1 ;
22                   SELECT  @ReturnText = substring ( @SplitString , @CurrentIndex , @NextIndex - @CurrentIndex );
23                   INSERT  INTO  @SplitStringsTable ( [ value ] VALUES ( @ReturnText );
24                   SELECT  @CurrentIndex = @NextIndex + 1 ;
25               END
26       RETURN ;
27  END

 

select * FROm dbo.SplitToTable('111,b2222,323232,32d,e,323232f,g3222', ',')

结果为

id          value
----------- ---------------------------------------
1           111
2           b2222
3           323232
4           32d
5           e
6           323232f
7           g3222

(7 行受影响)

 

使用循环的方法

首先GetSplitLength函数返回分割后的字符数组的长度。

 1  Create  function  [ dbo ] . [ GetSplitLength ]
 2  (
 3   @String  nvarchar ( max ),   -- 要分割的字符串
 4   @Split  nvarchar ( 10 )   -- 分隔符号
 5  )
 6  returns  int
 7  as
 8  begin
 9   declare  @location  int
10   declare  @start  int
11   declare  @length  int
12 
13   set  @String = ltrim ( rtrim ( @String ))
14   set  @location = charindex ( @split , @String )
15   set  @length = 1
16   while  @location <> 0
17   begin
18      set  @start = @location + 1
19      set  @location = charindex ( @split , @String , @start )
20      set  @length = @length + 1
21   end
22   return  @length
23  end

 

select dbo.GetSplitLength('111,b2222,323232,32d,e,323232f,g3222',',')

结果为7。

 

GetSplitOfIndex函数是按顺序分别获取分割后的字符串。

 

 1  ALTER  function  [ dbo ] . [ GetSplitOfIndex ]
 2  (
 3   @String  nvarchar ( max ),   -- 要分割的字符串
 4   @split  nvarchar ( 10 ),   -- 分隔符号
 5   @index  int  -- 取第几个元素
 6  )
 7  returns  nvarchar ( 1024 )
 8  as
 9  begin
10   declare  @location  int
11   declare  @start  int
12   declare  @next  int
13   declare  @seed  int
14 
15   set  @String = ltrim ( rtrim ( @String ))
16   set  @start = 1
17   set  @next = 1
18   set  @seed = len ( @split )
19   
20   set  @location = charindex ( @split , @String )
21   while  @location <> 0  and  @index > @next
22   begin
23      set  @start = @location + @seed
24      set  @location = charindex ( @split , @String , @start )
25      set  @next = @next + 1
26   end
27   if  @location  = 0  select  @location  = len ( @String ) + 1 
29   
30   return  substring ( @String , @start , @location - @start )
31  end

 

 select dbo.GetSplitOfIndex('111,b2222,323232,32d,e,323232f,g3222',',', 3)

结果323232。

 

 1  DECLARE  @Tags  nvarchar ( max );
 2  SELECT  @Tags = ' 111,b2222,323232,32d,e,323232f,g3222 ' ;
 3  DECLARE  @Tag  nvarchar ( 1000 )
 4  DECLARE  @next  int ;
 5  set  @next = 1
 6 
 7  DECLARE  @Length  int ;
 8  SELECT  @Length = dbo.GetSplitLength( @Tags , ' , ' )
 9 
10  while  @next <= @Length
11  begin
12       SET  @Tag  =  left (dbo.GetSplitOfIndex( @Tags , ' , ' , @next ),  16 );
13       print  @Tag
14       SET  @Next = @Next + 1 ;
15  END

结果为:

111
b2222
323232
32d
e
323232f
g3222

你可能感兴趣的:(split)