zoukankan      html  css  js  c++  java
  • 【转载】利用SQL的charindex实现字符串数组和Split函数 Virus

      大家在T-SQL中使用substring的时候需要注意一点,T-SQL的第一个字符的

    下标是从1开始的,不像在C#中第一字符是从0开始的。

    原文地址:SQL字符串数组操作
    文章出处:DIY部落(http://www.diybl.com/course/7_databases/sql/sqlServer/2007106/76999.html)

    /*
    一、按指定符号分割字符串,返回分割后的元素个数,方法很简单,就是看字符串中存在多少个分隔符号,然后再加一,就是要求的结果。
    --Alter function Get_StrArrayLength


    create function Get_StrArrayLength
    (
      @str varchar(5000),  --要分割的字符串
      @split varchar(10)  --分隔符号
    )
    returns int
    as
    begin
      declare @location int
      declare @start int
      declare @length int

      set @str=ltrim(rtrim(@str))
      set @location=charindex(@split,@str)
      set @length=1
      while @location<>0
      begin
        set @start=@location+1
        set @location=charindex(@split,@str,@start)
        set @length=@length+1
      end
      return @length
    end


    调用示例:select dbo.Get_StrArrayLength('1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48',',')
    返回值:4

    二、按指定符号分割字符串,返回分割后指定索引的第几个元素,象数组一样方便
    --alter function Get_StrArrayStrOfIndex


    create function Get_StrArrayStrOfIndex
    (
      @str varchar(5000),  --要分割的字符串
      @split varchar(10),  --分隔符号
      @index int --取第几个元素
    )
    returns varchar(5000)
    as
    begin
      declare @location int
      declare @start int
      declare @next int
      declare @seed int

      set @str=ltrim(rtrim(@str))
      set @start=1
      set @next=1
      set @seed=len(@split)
     
      set @location=charindex(@split,@str)
      while @location<>0 and @index>@next
      begin
        set @start=@location+@seed
        set @location=charindex(@split,@str,@start)
        set @next=@next+1
      end
      if @location =0 select @location =len(@str)+1
     --这儿存在两种情况:1、字符串不存在分隔符号 2、字符串中存在分隔符号,跳出while循环后,@location为0,那默认为字符串后边有一个分隔符号。
     
      return substring(@str,@start,@location-@start)
    end


    调用示例:select dbo.Get_StrArrayStrOfIndex('8,9,4',',',2)
    返回值:9

    三、结合上边两个函数,象数组一样遍历字符串中的元素

    declare @str varchar(5000)
    set @str='1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48'
    print dbo.Get_StrArrayLength(@str,',')
    declare @next int 
    set @next=1
    while @next<=dbo.Get_StrArrayLength(@str,',')
    begin
      print dbo.Get_StrArrayStrOfIndex(@str,',',@next)
      set @next=@next+1
    end

    print dbo.CheckStrInArr('21',@str)

    调用结果:
    1
    2
    3
    4
    5

    四、自己加一个函数,检查一个元素是否在数组中

    Alter function CheckStrInArr(@s as varchar(50),@sArr as varchar(5000)) returns int
    as
    begin
     declare @str varchar(5000)
     set @str=@sArr
     declare @next int 
     declare @ret int
     set @ret=0
     set @next=1
     while @next<=dbo.Get_StrArrayLength(@str,',')
     begin
       if dbo.Get_StrArrayStrOfIndex(@str,',',@next)=@s
      begin
      set @ret=1;
      end
       set @next=@next+1
     end
     return @ret
    end


    */

    文章出处:DIY部落(http://www.diybl.com/course/7_databases/sql/sqlServer/2007106/76999.html)

    原文地址:SQL实现split功能的函数
    文章出处:DIY部落(http://www.diybl.com/course/7_databases/sql/sqlServer/2007106/77000.html)

    分割再成批插入

    declare @s varchar(8000),@sql nvarchar(4000)
    set @s='1,12,1212,4545'
    set @sql='insert into t(col) select '+replace(@s,',',' col union all select ')
    exec(@sql)

    测试
    drop table #table
    declare @s varchar(8000),@sql nvarchar(4000)
    set @s='1,12,1212,4545,454'
    create table #table (col int)
    set @sql='insert into #table(col) select '+replace(@s,',',' col union all select ')
    exec(@sql)
    select * from #table

    create function f_split(@SourceSql varchar(8000),@StrSeprate varchar(10))
    returns @temp table(a varchar(100))
    --实现split功能 的函数
    as
    begin
    declare @i int
    set @SourceSql=rtrim(ltrim(@SourceSql))
    set @i=charindex(@StrSeprate,@SourceSql)
    while @i>=1
    begin
    insert @temp values(left(@SourceSql,@i-1))
    set @SourceSql=substring(@SourceSql,@i+1,len(@SourceSql)-@i)
    set @i=charindex(@StrSeprate,@SourceSql)
    end
    if @SourceSql<>'\'
    insert @temp values(@SourceSql)
    return
    end

    用法:select * from dbo.f_split('ABC:BC:C:D:E',':')
    文章出处:DIY部落(http://www.diybl.com/course/7_databases/sql/sqlServer/2007106/77000.html)

  • 相关阅读:
    Chap-6 6.1~6.3 程序装载
    X Window基础二(转)
    X Window基础一(转)
    Linux基础命令 su与sudo的区别
    Chap-4 Section 4.6 链接控制过程
    Chap-4 Section 4.5 静态库链接
    ceph的CRUSH数据分布算法介绍
    使用ffmpeg捕获USB外部摄像头视频流
    使用ffserver实现转发实时流媒体(摄像头捕获)
    内存映射文件(专门读写大文件)
  • 原文地址:https://www.cnblogs.com/virusswb/p/1685013.html
Copyright © 2011-2022 走看看