当前位置:Gxlcms > 数据库问题 > SQL Server自定义字符串分割函数——Split

SQL Server自定义字符串分割函数——Split

时间:2021-07-01 10:21:17 帮助过:10人阅读

USE [Test] 2 GO 3 /****** Object: UserDefinedFunction [dbo].[Split] Script Date: 2017/4/14 23:04:08 ******/ 4 SET ANSI_NULLS ON 5 GO 6 SET QUOTED_IDENTIFIER ON 7 GO 8 CREATE FUNCTION [dbo].[Split](@separator VARCHAR(64)=,,@string NVARCHAR(max)) 9 RETURNS @ResultTab TABLE ( 10 Id INT , 11 Res NVARCHAR(500) 12 ) 13 AS 14 BEGIN 15 DECLARE @Num INT 16 17 IF(@string IS NOT NULL AND @string <> ‘‘ AND LEN(@string)>0) 18 BEGIN 19 IF(CHARINDEX(@separator,@string)>0) --判断要截取的字符是否存在 20 BEGIN 21 SET @Num=0 22 WHILE (CHARINDEX(@separator,@string)>0) --如果要截取的字符存在,就继续循环 23 BEGIN 24 SET @Num=@Num+1 25 26 INSERT INTO @ResultTab(Id,Res) --截取字符串,插入表变量 27 SELECT @Num,LEFT(@string,CHARINDEX(@separator,@string)-1) 28 29 --把已经截取并插入的字符串删除 30 SET @string=STUFF(@string,1,CHARINDEX(@separator,@string)-1+LEN(@separator),‘‘) 31 END 32 33 --如果最后一个截取的字符串为空,那就不插入了 34 --例如:‘123,456,789,‘ 这样的字符串最后剩下的就是空字符串了 35 IF(@string IS NOT NULL AND @string <> ‘‘) 36 BEGIN 37 INSERT INTO @ResultTab(Id,Res) 38 SELECT @Num+1,@string 39 END 40 END 41 ELSE 42 BEGIN 43 DELETE FROM @ResultTab 44 END 45 END 46 ELSE 47 BEGIN 48 DELETE FROM @ResultTab 49 END 50 RETURN 51 END

下面来调用一下试试效果:

1 --因为这个函数创建的时候默认为以 逗号 分割,所以只需要使用 default 关键字就可以了
2 select * from Split(default,123,456,789)
3 
4 select * from Split(default,123,456,789,)
5 
6 --下面试试其它字符分割
7 select * from Split(abc,11111abc22222abc33333)
8 
9 select * from Split(abc,11111abc22222abc33333abc)

技术分享

不足的地方就是不能直接作用于表,和不能同时支持多字符分割。

当然,如果多定义几个参数,也是勉强可以的,不过我想的是能够和 C# 那种可以传入一个分割字符的数组,不过貌似 sql 自定义函数的参数不支持 table 类型。

另外,如果有什么好的想法,可以探讨一下。多谢~

SQL Server自定义字符串分割函数——Split

标签:ring   let   自己   split   arc   代码   create   _id   creat   

人气教程排行