--修订版1.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 r set r.scored=1
from Replys r inner join Topics t on r.TopicID=t.TopicID update t set t.scored=1
from Replys r inner join Topics 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(@UserIDlist,id,charindex(',',@UserIDlist+',',id)-id)
into #2 from #
where substring(','+@UserIDlist,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 Replys 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 UserScore (BoardID,UserID,UserScore) 
select @BoardID,u.userid,s.score
from #1 u,#2 s
where u.id=s.id
and not exists(
select * from UserScore where BoardID=@BoardID and UserID=u.userid)if @@error<>0
begin
raiserror('error,transaction not completed!',16,-1)
rollback transaction
return
endcommit transactionGO