短信字符串分拆

分拆短信中的数据

/*--问题描述
根据自定义信息前缀表(每个信息前缀可以看作是一个信息分隔符)进行字符串分拆处理的函数,在分拆处理函数中,首先定义了一个信息前缘表@splits,表中包含了AC、BC、CC、DC四个信息前缀(实际使用时,可以在函数中添加其他信息前缘,也可以定义一个正式表来保存信息前缀数据,这样就可以实现用户自定义信息前缀数据的处理)。它的分拆处理过程是这样的:
    (1) 在短信字符串中,每个信息都是以指定的信息前缀开头,后面紧跟该前缀包含的信息,所以首先获取短信字符串中,第一个信息前缀字符串及它的长度,如果短信字符串不是以某个信息前缀开头,则说明不是一个正确的短信字符串,直接返回空的结果集。
    (2) 获取第一个信息前缀后的第一个信息前缀位置。
    (3) 如果该信息前缀不存在,则表明是最后一段信息,将该段信息插入结果集并且退出函数。
    (4) 如果该信息前缀存在,则通过该位置截取当前信息段,将截取的信息段保存到结果集,然后从短信字符串中删除已经分拆的信息段,循环从(1)开始处理,直到分拆完所有的信息。

if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[f_splitSTR]') and xtype in (N'FN', N'IF', N'TF'))
drop function [dbo].[f_splitSTR]
GO
/*--字符串分函数
    根据自定义分隔符列表,分拆指定分隔符的的字符串,返回结果表
--邹建 2005.04(引用请保留此信息)--*/
/*--调用示例
    SELECT * FROM f_splitSTR(N'AC中国BC898CC美国人日本人DC中8c饿饭')
--*/
CREATE FUNCTION f_splitSTR(@s varchar(8000))
RETURNS @re TABLE(split varchar(10),value varchar(100))
AS
BEGIN
    DECLARE @splits TABLE(split varchar(10),splitlen as LEN(split))
    INSERT @splits(split)
    SELECT 'AC' UNION ALL
    SELECT 'BC' UNION ALL
    SELECT 'CC' UNION ALL
    SELECT 'DC'
    DECLARE @pos1 int,@pos2 int,@split varchar(10),@splitlen int
    SELECT TOP 1
    @pos1=1,@split=split,@splitlen=splitlen
    FROM @splits
    WHERE @s LIKE split+'%'
    WHILE @pos1>0
    BEGIN
        SELECT TOP 1
            @pos2=CHARINDEX(split,@s,@splitlen+1)
        FROM @splits
        WHERE CHARINDEX(split,@s,@splitlen+1)>0
        ORDER BY CHARINDEX(split,@s,@splitlen+1)
        IF @@ROWCOUNT=0
        BEGIN
            INSERT @re VALUES(@split,STUFF(@s,1,@splitlen,''))
            RETURN
        END
        ELSE
        BEGIN
            INSERT @re VALUES(@split,SUBSTRING(@s,@splitlen+1,@pos2-@splitlen-1))
            SELECT TOP 1
                @pos1=1,@split=split,@splitlen=splitlen,@s=STUFF(@s,1,@pos2-1,'')
            FROM @splits
            WHERE STUFF(@s,1,@pos2-1,'') LIKE split+'%'
        END
    END
    RETURN
END
GO

原帖地址

你可能感兴趣的:(字符处理)