Sql字串分組Split函式的兩種實現方法

iSQlServer發表於2010-01-04

在給文章加自定義標籤時,需要在儲存過程中對輸入的字串按照“,”字元分割成一個字元陣列。但是Sql中沒有實現字串分組的Split方法。因此就需要編寫一個自定義的Split函式。我首先是使用表值函式的方法實現的字串分組,但是在使用中感覺不是很方便。後來又在網上找到了一種使用兩個標量函式,其中一個函式首先返回分割後字元陣列的長度,另一個函式依次返回每個分割出的字串。然後使用迴圈依次獲取分割的字元。

表值函式實現Split方法

<!--Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/--&gt 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函式返回分割後的字元陣列的長度。

<!--Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/--&gt 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函式是按順序分別獲取分割後的字串。

 

<!--Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/--&gt 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。

 

<!--Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/--&gt 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

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/16436858/viewspace-624191/,如需轉載,請註明出處,否則將追究法律責任。

相關文章