创建表值函数:
1 CREATE FUNCTION [dbo].[F_Split] 2 ( 3 @SplitString nvarchar(max), --源字符串A 4 @Separator nvarchar(10)=' ' --分隔字符串B,默认为空格 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;--开始截取字符串A的位置 14 DECLARE @FindIndex int;--查询到字符串B的位置 15 DECLARE @ReturnText nvarchar(max);--分割后的字符 16 17 --保存被截取字符串B的长度 18 DECLARE @SeparatorLen int; set @SeparatorLen=len(@Separator); 19 20 SELECT @CurrentIndex=1; 21 WHILE(@CurrentIndex<=len(@SplitString))--遍历字符串A 22 BEGIN 23 --charindex(目标字符串,被查找的字符串,开始查找的位置(为空时默认从第一位开始查找)) 24 SELECT @FindIndex=charindex(@Separator,@SplitString,@CurrentIndex);--获取B在A中的位置 25 26 --如果B不存在A中,下一次查询到字符串的位置为:A的长度+B的长度 27 IF(@FindIndex=0 OR @FindIndex IS NULL) Begin SELECT @FindIndex=len(@SplitString)+@SeparatorLen;End 28 --获取分隔后的字符 29 30 --substring(被截取的字符串,开始截取字符串的位置,截取字符串的长度) 31 SELECT @ReturnText=substring(@SplitString,@CurrentIndex,@FindIndex-@CurrentIndex); 32 INSERT INTO @SplitStringsTable([value]) VALUES(@ReturnText); 33 34 --初始化开始截取字符串A的位置 35 SELECT @CurrentIndex=@FindIndex+@SeparatorLen; 36 END 37 RETURN; 38 END
查询到的结果如下:
select * from F_Split('12ab34ab56ab','ab')