DROP FUNCTION dbo.f_splitSTR
CREATE FUNCTION f_splitSTR(
@s varchar(8000), --待分拆的字符串
@split varchar(10) --数据分隔符
)RETURNS @re TABLE(col varchar(100))
AS
BEGIN
DECLARE @splitlen int
SET @splitlen=LEN(@split+'a')-2
WHILE CHARINDEX(@split,@s)>0
BEGIN
INSERT @re VALUES(LEFT(@s,CHARINDEX(@split,@s)-1))
SET @s=STUFF(@s,1,CHARINDEX(@split,@s)+@splitlen,'')
END
INSERT @re VALUES(@s)
RETURN
END--这句的含义 SET @splitlen=LEN(@split+'a')-2sql老大的--3.2.1 循环截取法
这句是为了读@split后面带空格的,因为LEN会自动忽略右边的空格
设置@splitlen这个变量的长度=它本身再加一个a字母的长度减2
--0
SELECT LEN('A '+'A')-2
--7
len函数会忽略后面的空格
与charindex(','+'a'+',',','+col+',')这样的处理逗号的方法有某些相似之处
@s varchar(8000), --待分拆的字符串
@split varchar(10) --数据分隔符
)RETURNS @re TABLE(col varchar(100))
AS
BEGIN
IF RIGHT(@s,1)<>@split
SET @s=@s+@split
WHILE CHARINDEX(@split,@s)>0
BEGIN
INSERT @re VALUES(LEFT(@s,CHARINDEX(@split,@s)-1))
SET @s=STUFF(@s,1,CHARINDEX(@split,@s),'')
END
INSERT @re VALUES(@s)
RETURN
END
GODECLARE @s VARCHAR(200)
SET @s='ab,cd,ee,ff,g'SELECT * FROM dbo.f_splitSTR(@s,',')
/*
col
----------------------------------------------------------------------------------------------------
ab
cd
ee
ff
g
(6 行受影响)
*/SET @s='ab,cd,ee,ff,g 'SELECT * FROM dbo.f_splitSTR(@s,',')
/*
col
----------------------------------------------------------------------------------------------------
ab
cd
ee
ff
g
(6 行受影响)*/SET @s='ab,cd,ee,ff,g ,'
/*
col
----------------------------------------------------------------------------------------------------
ab
cd
ee
ff
g
(6 行受影响)
*/可以改为这样。