我相信大部分人都碰到过,处理数据的时候,字段的值是以 ',' (逗号)分隔的形式,所以我也不能避免。
然后我才知道,sql 是没有类似于 C# 和 Javascript 这种分割字符串的方法。(Split)
所以我自己定义了一个 sql 函数(多声明表值函数),代码如下:
1 USE [Test] 2 GO 3 /****** Object: UserDefinedFunction [dbo].[Split] Script Date: /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 (10Id INT ,11ResNVARCHAR(500) 12 )13 AS14 BEGIN15DECLARE @Num INT1617IF(@string IS NOT NULL AND @string <> '' AND LEN(@string)>0)18BEGIN19 IF(CHARINDEX(@separator,@string)>0) --判断要截取的字符是否存在20 BEGIN21 SET @Num=022 WHILE (CHARINDEX(@separator,@string)>0) --如果要截取的字符存在,就继续循环23 BEGIN24 SET @Num=@Num+125 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 END32 33 --如果最后一个截取的字符串为空,那就不插入了34 --例如:'123,456,789,' 这样的字符串最后剩下的就是空字符串了35 IF(@string IS NOT NULL AND @string <> '')36 BEGIN37 INSERT INTO @ResultTab(Id,Res)38 SELECT @Num+1,@string 39 END 40 END41 ELSE42 BEGIN43 DELETE FROM @ResultTab44 END45END46ELSE47BEGIN48 DELETE FROM @ResultTab49END50RETURN51 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 类型。
另外,如果有什么好的想法,可以探讨一下。多谢~