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

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值