你的位置:首页 > 数据库

[数据库]SQL Server 分隔字符串函数实现


在SQL Server中有时候也会遇到字符串进行分隔的需求。平时工作中常常遇到这样的需求,例如:人员数据表和人员爱好数据表,一条人员记录可以多多人员爱好记录,而往往人员和人员爱好在界面展示层要一并提交入库的,至于实现该需求我大多采用两种方式:一种方式是代码先实现一条人员记录的添加或修改时,在数据访问层针对人员还好记录的循环添加或修改;还有一种通过存储封装,代码将选中的人员爱好记录标识键以分隔符连接起来作为字符串集,在存储过程中在分割字符串集,实现批量插入(注意:所举例说明有可能不完全妥当,如果博友指出不妥、错误以及建议,万分感谢)。

 
SQL Server分隔字符串函数实现,T-SQL代码如下:
 1 IF OBJECT_ID(N'[dbo].[ufn_SplitToTable]', N'TF') IS NOT NULL 2 BEGIN 3   DROP FUNCTION [dbo].[ufn_SplitToTable]; 4 END 5 GO 6  7 --================================== 8 -- 功能:分隔关键字字串集插入数据表 9 -- 作者: XXXX10 -- 创建: XXXX-XX-XX11 -- 修改: XXXX-XX-XX XX XXXXX12 -- 调用:SELECT * FROM dbo.ufn_SplitToTable2('1|2|3','|')13 --==================================14 CREATE FUNCTION [dbo].[ufn_SplitToTable]15 (16   @chvnKeyWords NVARCHAR(4000),    -- 要分隔的关键字字符串集17   @chvnSeparator NCHAR(1)        -- 要使用的分隔符,默认为'|'18 ) RETURNS @tblResult TABLE (19   Num INT IDENTITY(1, 1) NOT NULL,20   Word NVARCHAR(200) NOT NULL21 )22   --$Encode$--23 AS24 BEGIN25   -- 分隔符参数为NULL时则使用"|"      26   SET @chvnSeparator = ISNULL(@chvnSeparator, N'|');27 28   DECLARE @intPos AS INT = 0;29   SET @intPos = CHARINDEX(@chvnSeparator, @chvnKeyWords);30 31   WHILE @intPos >= 1 /* @intPos > 0*/32   BEGIN33     IF @intPos >= 2 /*@intPos > 1*/34     BEGIN35       INSERT INTO @tblResult (Word) 36       VALUES (LEFT(@chvnKeyWords, @intPos - 1));37     END38 39     -- 也可以使用SUBSTRING字符串函数 40     --SET @chvnKeyWords = SUBSTRING(@chvnKeyWords, @intPos + 1, LEN(@chvnKeyWords) - (@intPos + 1) + 1);41 42     SET @chvnKeyWords = STUFF(@chvnKeyWords, 1, @intPos, N'');43     SET @intPos = CHARINDEX(@chvnSeparator, @chvnKeyWords);44   END45 46   IF @chvnKeyWords > N''47   BEGIN48     INSERT INTO @tblResult (Word) 49     VALUES(@chvnKeyWords);50   END51 52   RETURN;53 END54 GO

执行以上函数的T-SQL代码如下:


1 SELECT *2 FROM dbo.ufn_SplitToTable(N'ab,bc,cc,bb,cd', N',');3 GO

得到的查询结果如下:



 
像下面这样的T-SQL代码:
1 SELECT *2 FROM dbo.ufn_SplitToTable(N',,1,2,3,6,8,,9,', ',');3 GO

执行后的查询结果为:



 
 
注意:本版本的分隔字符串函数则对两个分隔符连接起来的没有任何字符的不做任何处理。