zoukankan      html  css  js  c++  java
  • 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 -- 作者: XXXX
    10 -- 创建: XXXX-XX-XX
    11 -- 修改: XXXX-XX-XX XX XXXXX
    12 -- 调用: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 NULL
    21 )
    22     --$Encode$--
    23 AS
    24 BEGIN
    25     -- 分隔符参数为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     BEGIN
    33         IF @intPos >= 2 /*@intPos > 1*/
    34         BEGIN
    35             INSERT INTO @tblResult (Word) 
    36             VALUES (LEFT(@chvnKeyWords, @intPos - 1));
    37         END
    38  
    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     END
    45  
    46     IF @chvnKeyWords > N''
    47     BEGIN
    48         INSERT INTO @tblResult (Word) 
    49         VALUES(@chvnKeyWords);
    50     END
    51  
    52     RETURN;
    53 END
    54 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

    执行后的查询结果为:

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

     

  • 相关阅读:
    inner join(inner可省) 与 left join 之间的区别
    Jedis+Redis+spring缓存
    <meta name="viewport" content="width=device-width,initial-scale=1,minimum-scale=1,maximum-scale=1,user-scalable=no"/>
    js中的blob,图片base64URL,file之间的关系
    批量压缩图片
    xhr 的 onpregress 监听上传数据的 已上传 和 总大小
    如何禁止浏览器 前进功能
    获取页面滚动高度
    bootstrap的字体设置
    忽略 文件夹下的所有node/modules
  • 原文地址:https://www.cnblogs.com/dzy863/p/5054329.html
Copyright © 2011-2022 走看看