sql根据指定符号拆分字符串表函数

CREATE FUNCTION [dbo].[StrSplit]
(
	@str NVARCHAR(MAX),--字符串
	@split VARCHAR(10),--截取符号
	@num INT           --返回第几条数据,不填则全部返回
)
RETURNS @Temp TABLE 
(
	List VARCHAR(100)
)  
AS
BEGIN
    --用法
	----截取的数据全部返回
	--select *  from StrSplit('1234/123/345','/','')
 
	----返回指定的数据
	----例如返回第一个/后的数据
	--select *  from StrSplit('1234/123/345','/','2')
 
    DECLARE @t TABLE 
	(
		id INT IDENTITY(1,1),
		List VARCHAR(100)
	) 
    DECLARE @i INT=1
    DECLARE @j INT=1
    WHILE(@i>0)
    BEGIN    
        SET @i=CHARINDEX(@split,@str,@j)
        IF(@i>0)
        BEGIN
            INSERT @t
				(
					List
				) 
			VALUES
				(
					SUBSTRING(@str,@j,@i-@j)
				)
        END   
        ELSE 
		BEGIN
            INSERT @t
				(
					List
				) 
			VALUES
				(
					SUBSTRING(@str,@j,LEN(@str)-@j+1)
				)
        END
        SET @j = @i + 1   
    END
 
	--是否指定第几次数据
	--为空则全部返回,不为空则返回指定数据
	IF ISNULL(@num,'')=''
	BEGIN 
	   --返回全部数据
	   INSERT INTO @Temp
	   SELECT List FROM @t  
	END 
	ELSE 
	BEGIN 
	    --返回指定数据
	    INSERT INTO  @Temp
	    SELECT List FROM @t WHERE id=@num 
	END 
 
    RETURN
END

例:根据'/'拆分'111/222/4333/122'  我要取出'222',或得到拆分后全部数据

DECLARE @Test NVARCHAR(1000)='111/222/4333/122'
 
SELECT * FROM StrSplit(@Test,'/','2')
--返回结果即为:222
 
--@Test 为要拆分的变量
--'/' 根据符号'/'进行拆分
--'2' 为要去的第几位数据,如果不写为空的时候,则返回所有参数
 
--例如
SELECT * FROM StrSplit(@Test,'/','')
--则返回数据为:
--111
--222
--4333
--122

  

posted @ 2023-03-29 17:31  白泽^  阅读(250)  评论(0编辑  收藏  举报