一个数据表uname为
id name IDX
1 a 123
2 b 124
3 c 520
4 d 458
5 e 645
……
另一个表match为
id name IDX mark
1 e 645 85.6
2 b 124 89.5
……
表uname为总共有这么多用户,match为uname里面的用户报名参加之后进行存储的数据表,其中列mark为评委打分的,IDX类似与QQ号,唯一的。
先要利用存储过程实现报名和打分,且不能重复报名。
这个要如何实现
我在ASP.NET页面实现的报名SQL语句
insert match (IDX,username) select IDX,name from uname where IDX='" + txtIDX.Text + "'and not exists(select * from match where IDX='" + txtIDX.Text + "')
打分SQL语句
UPDATE match SET mark='" + tbscore.Text + "' WHERe IDX=" + tbIDX.Text
Create Procedure proc_math_insert(@ID int output,@IDX int,@mark float) --创建存储过程,Proc_math_insert @ID为输出变量及返回插入后返回的ID,IDX输入变量 @mark为输入变量
as
Declare @count As int --定义统计变量
Declare @Err As int --定义错误变量
Declare @name as nvarchar(50) --定义名称变量
set @Err=0 --设置错误变量为0及没有错误
Begin Tran --事件开始
Select @Count =Count(IDX) From Match where IDX=@IDX --查找传入的IDX在表match是否己经存在
IF @Count <=0 --如果不存在
Begin
Select @name=[name] From Uname where IDX=@IDX --查找IDX是否在Uname表中存在
If @name=null --如果不存在则出错,跳转至结束
Begin
set @Err=1
goto theEnd
End
Else --否则插入记录
Begin
Insert Match(IDX,Name,Mark) values(@IDX,@Name,@Mark)
End
End
Else --如果IDX在表match中己经存在则更新mark的值
Begin
update match set mark=@mark where IDx=@IDX
End
theEnd: --结束标签,如果出现错误跳转至此,如果正常也会执行到此处
IF @Err=0 --如果没有错误
Begin
Commit Tran --提交事件
SET @ID = @@IDENTITY --设置输出值为自动产生的ID值,在数据库我将ID设置为自动增量
End
Else --否则
Begin
Rollback Tran --回滚事件不执行所有语句
SET @ID = 0 --返回错误ID值为0
End
在查询分析器中调用方法
declare @ID as int --定义输出变量
exec proc_math_insert @ID output,123,888.5 --调用存储过程并且将返回值保存到@ID中
print @ID --输入@ID的值