sql server字符串分割函数split实现代码

发布时间:2019-10-19编辑:脚本学堂
本文介绍下在sql server中自定义split函数的方法,分享一例代码,学习下sql server中字符串分割函数split的实现方法,有需要的朋友参考下。

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类型的数据,这个比较简单,代码和上面的差不多这里就不给出了,可以根据上面的代码自己改写。

由于数据库中没有数组,所以只能用表变量返回,所以当定义这些函数时要定义表值函数。

有了以上的函数,就可以实现批量操作了。
当然由于变量都是考虑到溢出而设置的,肯能这样会给性能上带来一定的影响,但是编译后可能也可以给我们带来不少的效果,请大家慎用之。