打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

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

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

上一篇 / 下一篇 2010-01-04 09:38:34 / 个人分类:SQL Server技术

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

Create function [dbo].[GetSplitLength]
(
@String nvarchar(max), --要分割的字符串
@Split nvarchar(10) --分隔符号
)
returns int
as
begin
declare @location int
declare @start int
 declare @length int
 
set @String=ltrim(rtrim(@String))
set @location=charindex(@split,@String)
set @length=1
while @location<>0
begin
set @start=@location+1
set @location=charindex(@split,@String,@start)
set @length=@length+1
end
return @length
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。

DECLARE @Tags nvarchar(max);
SELECT @Tags='111,b2222,323232,32d,e,323232f,g3222';
DECLARE @Tag nvarchar(1000)
 DECLARE @next int;
set @next=1
 
DECLARE @Length int;
SELECT @Length=dbo.GetSplitLength(@Tags,',')

 while @next<=@Length
begin
 SET @Tag = left(dbo.GetSplitOfIndex(@Tags,',',@next), 16);
 print @Tag
 SET @Next=@Next+1;
 END

结果为:

111
b2222
323232
32d
e
323232f
g3222

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
SQL分割字符串函数
取出字符串中的汉字、字母或是数字
字符串处理函数
T-SQL象数组一样处理字符串、分割字符串
sql 分割字符串的函数整理
SQL函数的运用
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服