在给文章加自定义标签时,需要在存储过程中对输入的字符串按照“,”字符分割成一个字符数组。但是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

Copyright © 2024 チャチャの楽園
Powered by .NET 8.0 on Kubernetes