ALTER PROCEDURE [dbo].[SP_OPERATE_STRINGLIST_SPLIT]
@STRINGLIST NVARCHAR(4000), --被分解的清单字符串
@INDEX INT, --要取段的索引(从1开始)
@RESULT NVARCHAR(500) OUT, --返回的结果
@SPLITTER VARCHAR(5)=',' --分隔符号(默认为分号)
AS
BEGIN
SET NOCOUNT ON;
DECLARE @LIST_TEMP NVARCHAR(4000)
--去掉两端空格
SET @LIST_TEMP=LTRIM(RTRIM(ISNULL(@STRINGLIST,'')))
--去掉两端的分隔符号
--去前端
WHILE (LEN(@LIST_TEMP)>0)AND(CHARINDEX(@SPLITTER,@LIST_TEMP,1)=1)
SET @LIST_TEMP=SUBSTRING(@LIST_TEMP,1+LEN(@SPLITTER),LEN(@LIST_TEMP)-LEN(@SPLITTER))
--去后端
WHILE (LEN(@LIST_TEMP)>0)AND(CHARINDEX(@SPLITTER,@LIST_TEMP,LEN(@LIST_TEMP)-LEN(@SPLITTER)+1)=LEN(@LIST_TEMP)-LEN(@SPLITTER)+1)
SET @LIST_TEMP=SUBSTRING(@LIST_TEMP,1,LEN(@LIST_TEMP)-LEN(@SPLITTER))
------------------------------------------------------------
--循环变量
DECLARE @TEMP_I INT
SET @TEMP_I=1
WHILE (@TEMP_I<@INDEX) --将要取的段解到第一位
BEGIN
DECLARE @NEXT_INDEX INT
SET @NEXT_INDEX=CHARINDEX(@SPLITTER,@LIST_TEMP,1) --找下一段的索引
IF (@NEXT_INDEX=0) --表明已不够索引要求的长度
BEGIN
SET @RESULT=NULL
RETURN
END
ELSE
BEGIN
--计算第二段的开始索引,删除第一段
SET @LIST_TEMP=SUBSTRING(@LIST_TEMP,@NEXT_INDEX+LEN(@SPLITTER),LEN(@LIST_TEMP)-(@NEXT_INDEX+LEN(@SPLITTER))+1) --使第二段排在第一位
END
SET @TEMP_I=@TEMP_I+1
END
--经过上述步骤,要取的段已经放在第一位,取第一位即可
IF (CHARINDEX(@SPLITTER,@LIST_TEMP,1)=0) --再找不到分隔符了
BEGIN
--表示这是最后一个,直接返回
SET @RESULT=@LIST_TEMP
END
ELSE
BEGIN
--这不是最后一个,截取第一段
SET @RESULT=SUBSTRING(@LIST_TEMP,1,CHARINDEX(@SPLITTER,@LIST_TEMP,1)-1)
END
END