zoukankan      html  css  js  c++  java
  • SQL Server自定义字符串分割函数——Split

    我相信大部分人都碰到过,处理数据的时候,字段的值是以 ',' (逗号)分隔的形式,所以我也不能避免。

    然后我才知道,sql 是没有类似于 C# 和 Javascript 这种分割字符串的方法。( Split )

    所以我自己定义了一个 sql 函数(多声明表值函数),代码如下:

    复制代码
     1 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 类型。

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

  • 相关阅读:
    免费的视频、音频转文本
    Errors are values
    Codebase Refactoring (with help from Go)
    Golang中的坑二
    Cleaner, more elegant, and wrong(msdn blog)
    Cleaner, more elegant, and wrong(翻译)
    Cleaner, more elegant, and harder to recognize(翻译)
    vue控制父子组件渲染顺序
    computed 和 watch 组合使用,监听数据全局数据状态
    webstorm破解方法
  • 原文地址:https://www.cnblogs.com/asdyzh/p/9818702.html
Copyright © 2011-2022 走看看