用排序串字段实现树状结构(存储过程)

发表于:2007-06-30来源:作者:点击数: 标签:
加贴存储过程: if exists (select * from sysobjects where id = object_id(lybsave)) drop proc lybsave CREATE PROCEDURE [lybsave] @keyid int=0,@guestname varchar(20),@guestitle varchar(100),@guestcomm text,@guestemail varchar(50)=‘’‘’,@ema
加贴存储过程:
if exists (select * from sysobjects where id = object_id("lybsave"))
   drop proc lybsave
CREATE PROCEDURE [lybsave] @keyid int=0,@guestname varchar(20),@guestitle varchar(100),@guestcomm text,@guestemail varchar(50)=‘’‘’,@emailflag bit=0,@fromip varchar(15),@recimail varchar(50) OUTPUT
AS
DECLARE @ostr varchar(30),@rootid int,@lybid int,@ostrs varchar(30),@l tinyint,@tdt datetime,@putdate varchar(10),@puttime varchar(5),@eflag bit
select @tdt=getdate()
select @putdate=convert(varchar(4),datepart(yy,@tdt))+‘’-‘’+left(‘’0‘’+convert(varchar(2),datepart(mm,@tdt)),2)+‘’-‘’+left(‘’0‘’+convert(varchar(2),datepart(dd,@tdt)),2)
select @puttime=left(‘’0‘’+convert(varchar(2),datepart(hh,@tdt)),2)+‘’:‘’+left(‘’0‘’+convert(varchar(2),datepart(mi,@tdt)),2)
select @ostr=‘’‘’,@rootid=0,@lybid=0,@l=0
if (@guestemail=‘’‘’) select @emailflag=0
If @keyid=0  --发新贴
  goto newin
ELSE
begin
  SELECT @lybid=lybid,@rootid=rootid,@ostr=orderstr,@recimail=guestemail,@eflag=emailflag from guestbook where lybid=@keyid
  IF @lybid=0  --回复贴没找到,当新贴发表
   goto newin
  ELSE
   BEGIN
    if (@eflag=0 and @guestemail<>‘’swuse@21cn.com abc‘’) select @recimail=‘’‘’  --如果是版主回复且指定发邮件给提问者,则不管发贴者是否要求回复,后面的abc相当于管理密码
    if (@rootid=0) select @rootid=@lybid
    select @ostrs=@ostr+‘’%‘’,@lybid=0
    select top 1 @lybid=lybid,@ostrs=orderstr from guestbook where rootid=@rootid and (orderstr like @ostrs) and lybid<>@keyid order by orderstr
    if (@lybid=0) select @ostr=@ostr+char(122)
    else
     begin
      select @l=len(@ostrs)
      select @ostr=left(@ostrs,@l-1)+char(ascii(substring(@ostrs,@l,1))-1)
     end
    goto newin
   end
end

newin:
    INSERT into guestbook (guestname,guestitle,guestcomm,putdate,puttime,guestemail,emailflag,rootid,fromip,orderstr) values(@guestname,@guestitle,@guestcomm,@putdate,@puttime,rtrim(@guestemail),@emailflag,@rootid,@fromip,@ostr)

删贴(剪枝)存储过程:

if exists (select * from sysobjects where id = object_id("lybdel"))
   drop proc lybdel
CREATE PROCEDURE [lybdel] @keyid int
AS
DECLARE @ostr varchar(30),@rootid int,@lybid int
select @ostr=‘’‘’,@rootid=0,@lybid=0
SELECT @ostr=orderstr,@rootid=rootid,@lybid=lybid from guestbook where lybid=@keyid
if (@lybid<>0)
  BEGIN
    if (@rootid=0) select @rootid=@lybid
    SELECT @ostr=@ostr+‘’%‘’
    DELETE FROM guestbook where orderstr like @ostr and rootid=@rootid or lybid=@rootid
  END

软件使用主页http://swuse.yeah.net创作

原文转自:http://www.ltesting.net