数据库自定义表值函数Split(@LongStr, @SplitStr, @IsDistinct )
CREATE FUNCTION [dbo].[F3_Split](@LongStr VARCHAR(MAX),@SplitStr VARCHAR(100),@IsDistinct BIT)
RETURNS @RTable TABLE(ID INT IDENTITY PRIMARY KEY,ShortStr VARCHAR(MAX))
AS BEGIN
IF ISNULL(@LongStr,'')='' --表达式为空或NULL直接返回空表
RETURN
IF ISNULL(@SplitStr,'')='' --分隔符为空直接返回一条记录的表(存放表达式)
BEGIN
INSERT INTO @RTable(ShortStr) SELECT @LongStr
RETURN
END
DECLARE @Split_len INT
DECLARE @LongStr_len INT
SET @Split_len=LEN(@SplitStr) --分隔符的长度
SET @LongStr_len=LEN(@LongStr) --目前表达式的长度
WHILE CHARINDEX(@SplitStr,@LongStr)>0
BEGIN
DECLARE @ShortStr VARCHAR(1000) --分割后的字符串
SET @ShortStr=SUBSTRING(@LongStr,1,CHARINDEX(@SplitStr,@LongStr)-1) --每次从第1个位置开始取分隔符所在的位置-1为一截
SET @LongStr=SUBSTRING(@LongStr,CHARINDEX(@SplitStr,@LongStr)+@Split_len,(@LongStr_len-LEN(@ShortStr)-@Split_len)) --变换表达式的值为剩下的
SET @LongStr_len=LEN(@LongStr) --变换表达式的长度
IF @ShortStr<>'' AND @IsDistinct=1
INSERT INTO @RTable(ShortStr) SELECT @ShortStr
WHERE NOT EXISTS(SELECT 1 FROM @RTable WHERE ShortStr=@ShortStr) --将分割出来的字符串放入表中
ELSE IF @ShortStr<>''
INSERT INTO @RTable(ShortStr) SELECT @ShortStr
END
IF @LongStr<>'' AND @IsDistinct=1 --如果最后一截没有分隔符,则直接进入表中
INSERT INTO @RTable(ShortStr) SELECT @LongStr
WHERE NOT EXISTS(SELECT 1 FROM @RTable WHERE ShortStr=@LongStr)
ELSE IF @LongStr<>''
INSERT INTO @RTable(ShortStr) SELECT @LongStr
RETURN
END
最新文章
- kvm 使用入门详解
- Windows Phone 8.1又有什么新花样
- SpringAOP实现(原理)
- 第一次将内容添加到azure event hubs
- RAM与ROM
- 细说linux挂载——mount,及其他……
- 初尝Windows 下批处理编程
- TCP/UDP是如何传输的?
- JavaScript学习笔记(高级部分—01)
- mutex 和 spinlock 对比
- 虚拟机Q&;A
- js 检测浏览器
- js在工作中遇到的一些问题
- jmeter 脚本规范
- 小实验3:实现haproxy的增、删、查
- 用Canvas写一个简单的游戏--别踩白块儿
- [Zabbix3.0] 添加MySQL监控
- org.springframework.core.io.ClassPathResource类
- Metasploit Framework(3)Meterpreter
- 玩转Linux服务器常用命令