记得数年前写SQL脚本的时候,我需要把字符串根据某个特定字符分割出来使用,因为SQL Server是没有提供分割函数的,所以自己搞了个自定义函数来实现,实现过程当然是麻烦的。
使用传统方式实现字符串分割
首先传入原字符串和分隔符号作为参数,在函数体内部,通过while循环逐个判断字符串找到分割点,最终再返回表变量实现字符串的分割。
还好当年搞的SQL脚本还保存着,有兴趣的朋友可以参考一下:
create function [dbo].[fn_char_splitbystr]( @String nvarchar(4000),function @Delimiter nvarchar(100) ) returns @ValueTable table ([FValue] nvarchar(4000),[FSerial] int) as begin declare @value nvarchar(4000),@val nvarchar(4000) declare @NextString nvarchar(4000),@Pos int,@NextPos int,@CommaCheck nvarchar(1),@id int set @value=@String set @id=1 set @NextString='' set @CommaCheck=right(@value,1) set @value=@value+@Delimiter+space(len(@Delimiter)-1) set @Pos=charindex(@Delimiter,@value) set @NextPos = 1 while (@pos<>0) begin set @NextString=substring(@value,1,@Pos-1) set @val=@NextString if @id>1 set @val=substring(@val,len(@Delimiter),len(@val)) insert into @ValueTable([FValue],[FSerial]) VALUES (@val,@id) set @value=substring(@value,@pos+1,LEN(@value)) set @NextPos=@Pos set @pos=charindex(@Delimiter,@value) set @id=@id+1 end return end
运行示例参考下图:
返回的数据,就是一个表变量,可直接使用。但如果您看了自定义函数的处理过程,肯定会觉得好复杂。后来在查阅SQL Server 2016新语法的时候,赫然发现提供了内置的字符串分割函数STRING_SPLIT,可以说让我相当惊喜,我们今天就研究下这个函数的用法。
使用STRING_SPLIT分割字符串
使用string_split函数来分割字符串,那可就简单多了,我们先看看string_split的语法约定:
STRING_SPLIT(string,separator)
string为任何字符类型(例如nvarchar、varchar、nchar或char)的表达式。
separator为任何字符类型(例如nvarchar(1)、varchar(1)、nchar(1)或 char(1))的单字符表达式。
返回值就是子字符串的表变量。其中列名为“value”。
看上去似乎与我们自己写的自定义函数没多少区别吧,我们先来体验下效果:
不出所料,返回的数据基本就是我们需要的分割要求。
如果仔细观察,您可能会发现其实string_split还是有一定的弊端的:比如分隔符号只可以是单个的字符、不可以是一个字符串,还有就是缺乏顺序号等。其实顺序号很容易解决,通过自增字段就行了,但分隔符号的问题是硬伤。所以,如果您要求的分隔符不是单个字符,使用自定义函数还是有必要的。
希望对您有所帮助!