您的位置:首页 > 其它

和同学破解了一个邹老大的短信分拆算法!!!!!!!!!!1

2006-09-28 00:40 316 查看
/*==============================================*/

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

--3.2.6 分拆短信数据
CREATE FUNCTION f_splitSTR(@s varchar(8000)) -----------‘acthebcsex’
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 -----------在串中有分隔符,CIRCLE
BEGIN
SELECT TOP 1
@pos2=CHARINDEX(split,@s,@splitlen+1) ----------@pos2=6
FROM @splits
WHERE CHARINDEX(split,@s,@splitlen+1)>0 ----------------在串中要存在 >=2分隔符
ORDER BY CHARINDEX(split,@s,@splitlen+1)
IF @@ROWCOUNT=0 -------------只有一个分隔符时,如‘acthe’
BEGIN
INSERT @re VALUES(@split,STUFF(@s,1,@splitlen,'')) --------------@re(ac,the)
RETURN
END
ELSE ----------------------------如有2个以上分隔符时@s='acthebcsex'
BEGIN

---------@re(ac,substring('acthebcsex',3,6-3))=(ac,the)
INSERT @re VALUES(@split,SUBSTRING(@s,@splitlen+1,@pos2-@splitlen-1)) ---一步

SELECT TOP 1

---------------------重新送值,@pos1=1,重新进入外面CIRCLE,@split=bc,@s='bcsex' , 又从

@pos1=1,@split=split,@splitlen=splitlen,@s=STUFF(@s,1,@pos2-1,'')--------二步
FROM @splits
WHERE STUFF(@s,1,@pos2-1,'') LIKE split+'%' ----------新子串存在分隔符while>0开始运行,判断一下,执行

-----------一步:@re(bc,sex)

END
END
RETURN
END
GO

1,@s='acthebcsex',结果为;'ac','the' 'bc','sex'

2,我以前的认识以为@split会每次变化,实际上它是表变理任一个都可以的。

3, while 运行一下,从外到里,从里到外又要判断的,不成立退出,加一个return就可以了。

4,insert tablename() select * from tablename 二者的结果集必须一致,才可以传递。

5,多多学习多重CIRCLE的练习。

6,谢啦邹老大的算法。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: