--修订版1.1,并加注释
CREATE  PROCEDURE  p_payscore
@UserIDlist  varchar(2000),--从页面传来的用户ID列表,用,分割
@scorelist  varchar(2000),--从页面传来的得分列表
@TopicID  int,--结贴的贴子的id
@BoardID int--结贴的贴子所在的板块
AS  
declare  @UserID  int;--存储单个用户id的变量
declare  @score  smallint;  --存储单个用户得分的变量
begin  transaction  
update  Topics  set  scored=1  where  TopicID=@TopicID;--设置这个贴子的状态为已经结贴
if  @@error<>0  
begin  
           raiserror('error,transaction  not  completed!',16,-1)  
           rollback  transaction  
end  
update  Replys  r  set  scored=1  inner  join  Topics  t  where  r.TopicID=t.TopicID;  --设置回复表中所有相关回复的状态为已经结贴
if  @@error<>0  
begin  
           raiserror('error,transaction  not  completed!',16,-1)  
           rollback  transaction  
end  
set  @UserID=Split(@UserIDlist)  --分割用户列表到数组
set  @score=split(@scorelist)  --分割得分列表到数组
while  @v1<100  --做一个循环
begin  
update  Replys  set  score=@score[i]  where  UserID=@UserID[i] and TopicID=@TopicID;--设置用户的回贴所得的相应分数
if exists(select * from UserScore where BoardID=@BoardID and UserID=@UserID)--如果在得分表里有用户在这个板块的得分记录
begin
update UserScore set UserScore=UserScore+@score[i] where BoardID=@BoardID;--更新用户在此板块的得分记录
end
else----如果在得分表里没有用户在这个板块的得分记录
begin
insert into UserScore (BoardID,UserID,UserScore) values(@BoardID,@UserID,@UserScore)--插入一条新记录来记录用户在此板块的得分
end
select  @v1=(@v1+1)  --循环变量加一
end  
if  @@error<>0  
begin  
           raiserror('error,transaction  not  completed!',16,-1)  
           rollback  transaction  
end  commit  transaction  GO

解决方案 »

  1.   

    --btut2004修订版1.1,并加注释
    CREATE PROCEDURE p_payscore
    @UserIDlist varchar(2000),--从页面传来的用户ID列表,用,分割
    @scorelist varchar(2000),--从页面传来的得分列表
    @TopicID int,--结贴的贴子的id
    @BoardID int--结贴的贴子所在的板块
    AS
    declare @UserID int;--存储单个用户id的变量
    declare @score smallint; --存储单个用户得分的变量
    begin transaction
    update Replys r inner join Topics t on r.TopicID=t.TopicID set r.scored=1,t.scored=1 where r.TopicID=t.TopicID; --设置回复表中所有相关回复的状态为已经结贴,改主题的状态也是已经结贴
    if @@error<>0
    begin
    raiserror('error,transaction not completed!',16,-1)
    rollback transaction
    end
    set @UserID=Split(@UserIDlist) --分割用户列表到数组,sql server不支持数组
    set @score=Split(@scorelist) --分割得分列表到数组,sql server不支持数组
    while @v1<100 --做一个循环
    begin
    update Replys set score=@score[i] where UserID=@UserID[i] and TopicID=@TopicID;--设置用户的回贴所得的相应分数
    if exists(select * from UserScore where BoardID=@BoardID and UserID=@UserID)--如果在得分表里有用户在这个板块的得分记录
    begin
    update UserScore set UserScore=UserScore+@score[i] where BoardID=@BoardID;--更新用户在此板块的得分记录
    end
    else----如果在得分表里没有用户在这个板块的得分记录
    begin
    insert into UserScore (BoardID,UserID,UserScore) values(@BoardID,@UserID,@UserScore)--插入一条新记录来记录用户在此板块的得分
    end
    select @v1=(@v1+1) --循环变量加一
    end
    if @@error<>0
    begin
    raiserror('error,transaction not completed!',16,-1)
    rollback transaction
    endcommit transactionGO
      

  2.   

    --修订版1.1.1,并加注释
    --exec p_bbs_PayScore '1,2 ','7,7',5,1
    CREATE PROCEDURE p_bbs_PayScore
    @UserIDlist varchar(2000),--从页面传来的用户ID列表,用,分割
    @scorelist varchar(2000),--从页面传来的得分列表
    @TopicID int,--结贴的贴子的id
    @BoardID int--结贴的贴子所在的板块
    AS
    declare @UserID int;--存储单个用户id的变量
    declare @score smallint; --存储单个用户得分的变量
    begin transactionupdate r set r.scored=1
    from T_bbs_Reply r inner join T_bbs_Topic t on r.TopicID=t.TopicID --设置回复的结贴状态是已结贴update t set t.scored=1
    from T_bbs_Reply r inner join T_bbs_Topic t on r.TopicID=t.TopicID 
    where t.TopicID=@TopicID; --设置回复表中所有相关回复的状态为已经结贴,改主题的状态也是已经结贴if @@error<>0
    begin
    raiserror('error,transaction not completed!',16,-1)
    rollback transaction
    return
    end-- 分拆
    select top 2000  --根据 @UserIDlist 和 @scorelist 的最大的长度决定
    id=identity(int,1,1) into #
    from sysobjects a,syscolumns bdeclare @rows1 int,@rows2 int
    select id=identity(int,1,1),
    userid=substring(@UserIDlist,id,charindex(',',@UserIDlist+',',id)-id)
    into #1 from #
    where substring(','+@UserIDlist,id,1)=','
    set @rows1=@@rowcountselect id=identity(int,1,1),
    score=substring(@scorelist,id,charindex(',',@scorelist+',',id)-id)
    into #2 from #
    where substring(','+@scorelist,id,1)=','
    set @rows2=@@rowcountif @rows1<>@rows2
    begin
    raiserror('用户数和分数列有不匹配',16,1)
    rollback tran
    return
    endif @rows1=0
    begin
    raiserror('必须指定要给分的用户列表',16,1)
    rollback tran
    return
    end--更新回复表的得分纪录
    update a set score=s.score
    from T_bbs_Reply a,#1 u,#2 s
    where a.UserID=u.userid and a.TopicID=@TopicID
    and u.id=s.id
    if @@error<>0
    begin
    raiserror('error,transaction not completed!',16,-1)
    rollback transaction
    return
    end--得分纪录插入到用户得分表
    --空缺更新用户得分表部分insert into T_bbs_UserScore (ScoreBoardID,UserID,Score) 
    select @BoardID,u.userid,s.score
    from #1 u,#2 s
    where u.id=s.id
    and not exists(
    select * from T_bbs_UserScore where ScoreBoardID=@BoardID and UserID=u.userid)if @@error<>0
    begin
    raiserror('error,transaction not completed!',16,-1)
    rollback transaction
    return
    endcommit transaction
    GO
      

  3.   

    --btut2004修订版1.2,并加注释,欢迎来我的论坛,感谢邹建老大的字符串分割部分
    --exec p_bbs_PayScore '1,2 ','7,7',5,1
    CREATE PROCEDURE p_bbs_PayScore
    @UserIDlist varchar(2000),--从页面传来的用户ID列表,用,分割
    @scorelist varchar(2000),--从页面传来的得分列表
    @TopicID int,--结贴的贴子的id
    @BoardID int--结贴的贴子所在的板块
    AS
    declare @UserID int;--存储单个用户id的变量
    declare @score smallint; --存储单个用户得分的变量
    begin transactionupdate r set r.scored=1
    from T_bbs_Reply r inner join T_bbs_Topic t on r.TopicID=t.TopicID --设置回复的结贴状态是已结贴update t set t.scored=1
    from T_bbs_Reply r inner join T_bbs_Topic t on r.TopicID=t.TopicID 
    where t.TopicID=@TopicID; --设置回复表中所有相关回复的状态为已经结贴,改主题的状态也是已经结贴if @@error<>0
    begin
    raiserror('error,transaction not completed!',16,-1)
    rollback transaction
    return
    end-- 分拆
    select top 2000  --根据 @UserIDlist 和 @scorelist 的最大的长度决定
    id=identity(int,1,1) into #
    from sysobjects a,syscolumns bdeclare @rows1 int,@rows2 int
    select id=identity(int,1,1),
    userid=substring(@UserIDlist,id,charindex(',',@UserIDlist+',',id)-id)
    into #1 from #
    where substring(','+@UserIDlist,id,1)=','
    set @rows1=@@rowcountselect id=identity(int,1,1),
    score=substring(@scorelist,id,charindex(',',@scorelist+',',id)-id)
    into #2 from #
    where substring(','+@scorelist,id,1)=','
    set @rows2=@@rowcountif @rows1<>@rows2
    begin
    raiserror('用户数和分数列有不匹配',16,1)
    rollback tran
    return
    endif @rows1=0
    begin
    raiserror('必须指定要给分的用户列表',16,1)
    rollback tran
    return
    end--更新回复表的得分纪录
    update a set score=s.score
    from T_bbs_Reply a,#1 u,#2 s
    where a.UserID=u.userid and a.TopicID=@TopicID
    and u.id=s.id
    if @@error<>0
    begin
    raiserror('error,transaction not completed!',16,-1)
    rollback transaction
    return
    end--更新用户得分表
    update T_bbs_UserScore set T_bbs_UserScore.Score=T_bbs_UserScore.Score+s.score
    from #1 u,#2 s
    where u.id=s.id
    and ScoreBoardID=@BoardID and T_bbs_UserScore.UserID=u.useridinsert into T_bbs_UserScore (ScoreBoardID,UserID,Score) 
    select @BoardID,u.userid,s.score
    from #1 u,#2 s
    where u.id=s.id
    and not exists(
    select * from T_bbs_UserScore where ScoreBoardID=@BoardID and UserID=u.userid)--更新用户表
    update T_user set T_user.Score=T_user.Score+s.score
    from #1 u,#2 s
    where u.id=s.id
    and T_user.UserID=u.useridif @@error<>0
    begin
    raiserror('error,transaction not completed!',16,-1)
    rollback transaction
    return
    endcommit transaction
    GO