[SQL] Procedure - 查询后判断后,新增数据

摘要:[SQL] Procedure - 查询后判断后,新增数据


最近用了Procedure 来做一个案子,内容主要是有名额限制的旅行团共三团,因为再开放报名的时候会有上百人同时上线,
以SQL来说,要先SELECT出实际现在的名额,然后确定有名额后,在新增报名数据,但同时有多人来报名,
所以必须用事务来处理,但是如果是在server端用function来处理话,单纯用事务处理是不够的,
因为我们在下select到出数据库,数据库回传数据,再判断,然后新增,虽然是短短的一秒内可完成,
但是却可能会有和别人数据同时写入的问题,因为用的是functioin,为了避免这种情形,就写了一个Procedure,
同时完成SELECT和INSERT还有判断,主机是MS-SQL:

drop? proc chk_insert ??这边是删除叫做chk_insert的Procedure,因为我有新增过
go ?执行上面的命令
create proc chk_insert 新增叫做chk_insert的Procedure
[email protected] int,@member_id nvarchar(50),@trip_id int,@isfriend nvarchar(50),@true_num int output? 声明变量,@true_num为输出变量
?as
begin tran ?开始事务处理
select? @true_num=true_num?from view_trip where idnum = @trip_id? and [email protected]?and status = ‘0‘ and enable =‘1‘? and true_num>0
执行SELECT,判断人数是否大于0
if @@rowcount >0 ?如果查询到数据,便新增报名数据
begin
?insert into trip_list (member_id,yy,trip_id,creater,isfriend)? values(@member_id,@yy,@trip_id,@member_id,@isfriend)
end
commit tran
go? 到此结束Procedure,会在数据库中,新增一个Procedure对象

以下为传递变量的方法
declare @int_true int ?声明@int_true 来接收@true_num
exec chk_insert? @yy=2009,@member_id=‘0123‘,@trip_id=1,@isfriend=‘n‘,@[email protected]_true output? 执行chk_insert这个Procedure并传函数
select @int_true ‘num‘? 抓@int_true 传出的数据

结果:
num
======
数值或NULL

原文:大专栏  [SQL] Procedure - 查询后判断后,新增数据

相关文章
相关标签/搜索