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
此处采用递归处理,批量插入返回的表变量。
相关文章推荐
- hdu5652 India and China Origins 深搜+二分
- Android - Shared Preference (分享首选项) 具体解释
- Spring第12篇—— Spring对Hibernate的SessionFactory的集成功能
- 事务中的tx:method
- spring学习笔记(25)spring整合quartz多版本实现企业级任务调度
- 69.block 用法详解及注意事项
- HDU 1520 Anniversary party 树形DP入门
- liunx下文件授权可执行权限chmod
- django orm总结
- Python入门阶段总结
- 利用requests库post一张图片请求
- 连接池实现原理
- 【bzoj1507】[NOI2003]Editor
- liunx下文件授权可执行权限chmod
- 八大排序算法的 Python 实现
- 你所不知道的黑客工具之 EK 篇
- Spring第13篇—–Spring整合Hibernate之声明式事务管理
- Aliyun linux5.7 64位 安装 jdk1.7
- 开发环境配置-eclipse统一格式-1
- js判断为空