Sql字符串分組Split函數(shù)的兩種實(shí)現(xiàn)方法上一篇 / 下一篇 2010-01-04 09:38:34 / 個(gè)人分類:SQL Server技術(shù) 在給文章加自定義標(biāo)簽時(shí),需要在存儲(chǔ)過程中對(duì)輸入的字符串按照“,”字符分割成一個(gè)字符數(shù)組。但是Sql中沒有實(shí)現(xiàn)字符串分組的Split方法。因此就需要編寫一個(gè)自定義的Split函數(shù)。我首先是使用表值函數(shù)的方法實(shí)現(xiàn)的字符串分組,但是在使用中感覺不是很方便。后來又在網(wǎng)上找到了一種使用兩個(gè)標(biāo)量函數(shù),其中一個(gè)函數(shù)首先返回分割后字符數(shù)組的長度,另一個(gè)函數(shù)依次返回每個(gè)分割出的字符串。然后使用循環(huán)依次獲取分割的字符。 表值函數(shù)實(shí)現(xiàn)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', ',') 結(jié)果為 id value (7 行受影響) 使用循環(huán)的方法 首先GetSplitLength函數(shù)返回分割后的字符數(shù)組的長度。 Create function [dbo].[GetSplitLength]
( @String nvarchar(max), --要分割的字符串 @Split nvarchar(10) --分隔符號(hào) ) 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',',') 結(jié)果為7。 GetSplitOfIndex函數(shù)是按順序分別獲取分割后的字符串。 1 ALTER function [dbo].[GetSplitOfIndex] 2 ( 3 @String nvarchar(max), --要分割的字符串 4 @split nvarchar(10), --分隔符號(hào) 5 @index int --取第幾個(gè)元素 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) 結(jié)果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 結(jié)果為: 111 |
|
|