短信字符串分拆


分拆短信中的数据

/*--问题描述
根据自定义信息前缀表(每个信息前缀可以看作是一个信息分隔符)进行字符串分拆处理的函数,在分拆处理函数中,首先定义了一个信息前缘表@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

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