您的位置:首页 > 其它

UDF_StringToTable 普通与递归实现

2016-03-28 16:59 309 查看
今天闲来无事,写个函数备用。先是用while循环处理,用Table返回

USE RFIDEng
GO

/***********************************************************************
** CREATOR:JustinYang DateTime:2016-03-28
** FUNCTION:Change a String To Table
** USE:SELECT * FROM UDF_StringToTable(',12,;36,;245,',',;')
** SELECT * FROM UDF_StringToTable(',12,;36,;245,',',')
**************************************************************************/
ALTER FUNCTION UDF_StringToTable(
@sStr varchar(4000),
@SepaOp VARCHAR(5)
)
RETURNS @StringTable TABLE(id int,sSubStr varchar(100))
AS
BEGIN
DECLARE @CurrStr varchar(100)
SET @CurrStr = ''
DECLARE @i int
SET @i = 1
WHILE(len(@sStr)>LEN(@SepaOp))
BEGIN
IF (SUBSTRING(@sStr,1,LEN(@SepaOp)) = @SepaOp )
BEGIN
SET @sStr = RIGHT(@sStr,LEN(@sStr)-LEN(@SepaOp))
END
SET @CurrStr = CASE WHEN CHARINDEX(@SepaOp,@sStr)>0 THEN SUBSTRING(@sStr,1,CHARINDEX(@SepaOp,@sStr)-1) ELSE @sStr END
INSERT INTO @StringTable(id,sSubStr) VALUES (@i,@CurrStr)
SET @sStr = STUFF(@sStr,CHARINDEX(@CurrStr,@sStr),LEN(@CurrStr),'')
SET @i = @i +1
END
SET @CurrStr = CASE WHEN CHARINDEX(@SepaOp,@sStr)>0 THEN SUBSTRING(@sStr,1,CHARINDEX(@SepaOp,@sStr)-1) ELSE @sStr END
IF(LEN(@CurrStr)>= 1)
INSERT INTO @StringTable(id,sSubStr) VALUES (@i,@CurrStr)
RETURN
END


再看递归算法:

/***********************************************************************
** CREATOR:JustinYang DateTime:2016-03-28
** FUNCTION:Change a String To Table
** USE:SELECT * FROM UDF_StringToTableNew(',12,;36,;245,',',;',0)
** SELECT * FROM UDF_StringToTableNew(',12,;36,;245,',',',1)
**************************************************************************/
CREATE FUNCTION UDF_StringToTableNew(
@sStr varchar(4000),
@SepaOp VARCHAR(5),
@i int = 1
)
RETURNS @StringTable TABLE(id int,sSubStr varchar(100))
AS
BEGIN
DECLARE @CurrStr varchar(100)
SET @CurrStr = ''
IF @i< 1 RETURN
IF(len(@sStr)>LEN(@SepaOp))
BEGIN
IF (SUBSTRING(@sStr,1,LEN(@SepaOp)) = @SepaOp )
BEGIN
SET @sStr = RIGHT(@sStr,LEN(@sStr)-LEN(@SepaOp))
END
SET @CurrStr = CASE WHEN CHARINDEX(@SepaOp,@sStr)>0 THEN SUBSTRING(@sStr,1,CHARINDEX(@SepaOp,@sStr)-1) ELSE @sStr END
INSERT INTO @StringTable(id,sSubStr) VALUES (@i,@CurrStr)
SET @sStr = STUFF(@sStr,CHARINDEX(@CurrStr,@sStr),LEN(@CurrStr),'')
SET @i = @i +1

INSERT INTO @StringTable ( id, sSubStr )
SELECT id,sSubStr FROM UDF_StringToTableNew(@sStr,@SepaOp,@i)
END
SET @CurrStr = CASE WHEN CHARINDEX(@SepaOp,@sStr)>0 THEN SUBSTRING(@sStr,1,CHARINDEX(@SepaOp,@sStr)-1) ELSE @sStr END
IF(LEN(@CurrStr)>= 1)
INSERT INTO @StringTable(id,sSubStr) VALUES (@i,@CurrStr)
RETURN
END


此处采用递归处理,批量插入返回的表变量。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: