--修订版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
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
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
--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
--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