SQLserver字符串分割函数
 一、按指定符号分割字符串,返回分割后的元素个数,方法很简单,就是看字符串中存在多少个分隔符号,然后再加一,就是要求的结果。

 CREATE function Get_StrArrayLength
 (
 ??@str varchar(1024),??--要分割的字符串
 ??@split varchar(10)??--分隔符号
 )
 returns int
 as
 begin
 ??declare @location int
 ??declare @start int
 ??declare @length int

 ??set @str=ltrim(rtrim(@str))
 ??set @location=charindex(@split,@str)
 ??set @length=1
 ??while @location<>0
 ??begin
 ????set @start=@location+1
 ????set @location=charindex(@split,@str,@start)
 ????set @length=@length+1
 ??end
 ??return @length
 end
 调用示例:select dbo.Get_StrArrayLength('78,1,2,3',',')
 返回值:4

 二、按指定符号分割字符串,返回分割后指定索引的第几个元素,象数组一样方便

 CREATE function Get_StrArrayStrOfIndex
 (
 ??@str varchar(1024),??--要分割的字符串
 ??@split varchar(10),??--分隔符号
 ??@index int --取第几个元素
 )
 returns varchar(1024)
 as
 begin
 ??declare @location int
 ??declare @start int
 ??declare @next int
 ??declare @seed int

 ??set @str=ltrim(rtrim(@str))
 ??set @start=1
 ??set @next=1
 ??set @seed=len(@split)
 ??
 ??set @location=charindex(@split,@str)
 ??while @location<>0 and @index>@next
 ??begin
 ????set @start=@location+@seed
 ????set @location=charindex(@split,@start)
 ????set @next=@next+1
 ??end
 ??if @location =0 select @location =len(@str)+1
 --这儿存在两种情况:1、字符串不存在分隔符号 2、字符串中存在分隔符号,跳出while循环后,@location为0,那默认为字符串后边有一个分隔符号。
 ??
 ??return substring(@str,@start,@location-@start)
 end
 调用示例:select dbo.Get_StrArrayStrOfIndex('8,9,4',',2)
 返回值:9

 三、结合上边两个函数,象数组一样遍历字符串中的元素

 create???function??? f_splitstr(@SourceSql???varchar(8000),@StrSeprate???varchar(100))???
 ??returns???@temp???table(F1???varchar(100))???
 ??as?????
 ??begin???
 ??declare???@ch???as???varchar(100)???
 ??set???@SourceSql=@SourceSql+@StrSeprate?????
 ??while(@SourceSql<>'')???
 ??????????????????begin???
 ??????????????????set???@ch=left(@SourceSql,charindex(',@SourceSql,1)-1)???
 ??insert???@temp???values(@ch)???
 ??set???@SourceSql=stuff(@SourceSql,1,1),'')???
 ??????????????????end???
 ??return???
 ??end???
 ????

 ----调用
 ??select???*???from??? dbo.f_splitstr('1,3,')
 --结果:
 1
 2
 3
 4


(编辑:李大同)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|