zoukankan      html  css  js  c++  java
  • [SqlServer]数据库中自定义拆分字符串函数Split() (转)

        经常我们要用到批量操作时都会用到字符串的拆分,郁闷的是SQL Server中却没有自带Split函数,所以我们只能自己动手来解决一下。为了减少和数据库的通讯次数,我们都会利用这种方法来实现批量操作。当然有时我们会借助Execute这个方法来实现,利用这个方法有一个不好的地方就是她只认识以","分割的字符串,在传IDs批量操作的时候还是可以达到目的,但是经常我们要用到更复杂的操作时我们就需要自己动手来完成了......

        1.当我们需要传入很长的字符串是我们可以借助NText和Text类型,他们的区别是一个是支持Unicode,一个是支持ANSI字符集的。需要注意的是当我们要计算字符串长度时我们需要用到DATALENGTH()而不是LEN(),在NText类型中一个字符占两个字节,所以在计算字符时别忘了除以2,下面我们先看下例子就能够说明一切了。

    -- =============================================
    --
     Author:        <myxbing>
    -
    - Create date:   <2007/8/17>
    --
     Description:   <拆分字符串函数>
    --
     =============================================
    CREATE FUNCTION [dbo].[Split]
    (
     
    @SplitString text, -- 如果要传入NText类型,下面需要相应的修改,注释行为NText下同
     
    @Separator varchar(2= ','-- NVarChar(2) = N','
    )
    RETURNS @SplitStringsTable TABLE
    (
     
    [id] int identity(1,1),
     
    [value] varchar(8000) -- NVarChar(4000)
    )
    AS
    BEGIN
        
    DECLARE @CurrentIndex int;
        
    DECLARE @NextIndex int;
        
    DECLARE @ReturnText varchar(8000);-- NVarChar(4000)
        SELECT @CurrentIndex=1;
        
    WHILE(@CurrentIndex<=datalength(@SplitString)) -- DATALENGTH(@SplitString)/2
        BEGIN
            
    SELECT @NextIndex=charindex(@Separator,@SplitString,@CurrentIndex);
            
    IF(@NextIndex=0 OR @NextIndex IS NULL)
                
    SELECT @NextIndex=datalength(@SplitString)+1;--DATALENGTH(@SplitString)/2
            
            
    SELECT @ReturnText=substring(@SplitString,@CurrentIndex,@NextIndex-@CurrentIndex);

            
    INSERT INTO @SplitStringsTable([value])
            
    VALUES(@ReturnText);
            
            
    SELECT @CurrentIndex=@NextIndex+1;
        
    END
        
    RETURN;
    END

        有时我们拆分出来还是需要很长的字符串有可能超过(N)VarChar的长度,当然为了兼容SQL Server2000不能用max,所以我们拆出的字符串还是要用(N)Text来表示,需要注意的是在局部变量中不能定义(N)Text的类型,不过我们可以把substring出来的字符串直接加入到表变量中,而不要付值后在Insert。

        2.当我们传入的(N)VarChar时,我们可以用LEN来计算长度,值得注意的是NVarChar的最大长度是4000,而VarChar的最大长度是8000。下面我们来看一下代码,和上面的代码基本没什么差别。

    -- =============================================
    --
     Author:        <myxbing>
    --
     Create date:   <2007/8/18>
    --
    Description:   <拆分字符串函数>
    --
     =============================================
    Create Function [dbo].[ufn_Split]
    (
    @content varchar(8000),
    @seperator varchar(20)
    )
    RETURNS @temp table
    (
    --Id int identity(1,1),
    Value varchar(8000)
    )
    BEGIN
    declare @CurrIndex int, @NextIndex int
    select @CurrIndex = 1
    select @NextIndex = 1
    select @NextIndex=charindex(@seperator, @content)
    while (@NextIndex > 0)
    begin
    if (@NextIndex >= @CurrIndex+1)
    begin
    insert into @temp (Value) values (substring(@content, @CurrIndex, @NextIndex-@CurrIndex))
    end
    select @CurrIndex = @NextIndex + 1
    select @NextIndex=charindex(@seperator, @content, @CurrIndex)
    end
    if @CurrIndex <= datalength(@content)
    insert into @temp (Value) values (substring(@content, @CurrIndex, datalength(@content)-@CurrIndex+1))
    return
    END


        3.拆分字符串,得到int类型的数据,这个比较简单,代码和上面的差不多这里就不给出了,可以根据上面的代码自己改写。

        由于数据库中没有数组,所以只能用表变量返回,所以当你定义这些函数时要定义表值函数。OK有了这些函数我们就可以很好的利用他们来为我们的更有效的批量操作。当然由于变量都是考虑到溢出而设置的,肯能这样会给性能上带来一定的影响,但是编译后可能也可以给我们带来不少的效果,请大家慎用之。

  • 相关阅读:
    2019-2020-1 20175202 20175204 20175216 《信息安全系统设计基础》实验三 并发程序
    2019-2020-1 20175202 20175204 20175216 《信息安全系统设计基础》实验二 固件程序设计
    2019-2020-1 20175202 20175204 20175216 《信息安全系统设计基础》实验一 开发环境的熟悉
    2019-2020-1 20175202 《信息安全系统设计基础》第二周学习总结
    2018-2019-2 20175202实验五《网络编程与安全》实验报告
    ucosii
    ls实现及对ls的改进
    mystate实现
    2019—2020 20175203 20175206 实验五 通讯协议设计补交
    20175203-20175206 实验四 《外设驱动程序设计》
  • 原文地址:https://www.cnblogs.com/footleg/p/921345.html
Copyright © 2011-2022 走看看