• [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].[Split]
    (
     
    @SplitString varchar(8000),-- nvarchar(4000)
     @Separator varchar(2= ','
    )
    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<=len(@SplitString)) 
        
    BEGIN
            
    SELECT @NextIndex=charindex(@Separator,@SplitString,@CurrentIndex);
            
    IF(@NextIndex=0 OR @NextIndex IS NULL)
                
    SELECT @NextIndex=len(@SplitString)+1;
            
            
    SELECT @ReturnText=substring(@SplitString,@CurrentIndex,@NextIndex-@CurrentIndex);

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

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

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

  • 相关阅读:
    Java实现继承过程概述
    Java封装概述
    Java中包的介绍
    Java中final关键字概述
    Java继承概述
    mysql服务自动关闭的解决
    Unity3d碰撞检测中碰撞器与触发器的区别
    解决在Game模式下兼容编辑器模式
    GameObject.Find("")只能查找到显示的对象
    层(layer)的设置
  • 原文地址:https://www.cnblogs.com/xdotnet/p/sql_split_string.html
Copyright © 2020-2023  润新知