在T-SQL语法中我们可以用到「新增(INSERT)」、「更新(UPDATE)」、「删除(DELETE)」来做到处理资料的作业和功能,但是在实务上常常会有许多事情是无法由一段T-SQL处理完成的,例如在进销存系统中的进货作业,一项作业就必须更新「进货单主档」、「进货单明细」、「产品库存」三个资料表。
面对上述状况有一部分人会用「触发程序(Trigger)」,但是在无法使用「触发程序(Trigger)」的状态下,就必须执行三段T-SQL才能完成一项进货作业,但每一段T-SQL都是独立执行的,执行完第一段就会接着执行第二段、第三段,也就是说就算其中第一段或第二段的T-SQL错误,第三段SQL一样会执行,这种状况会直接造成库存数量错误,引起资料错乱,当然也可以靠程式去处理这些问题,但这些事其实可以直接在SQL中用「交易(Transaction)」做判断处理。
交易管理的语法:
1.BEGIN TRANSACTION:开启交易,打开交易功能。
2.COMMIT TRANSACTION:确认交易,在交易结束时确认交易,在确认时资料才会真的写入资料表。
3.ROLLBACK TRANSACTION:回复交易,执行这行时,会回复在交易内所有T-SQL所更动的内容。
以下使用交易:
--先开启交易BEGIN TRANSACTION--定义变数,这边用来放值型的T-SQL是否有错误DECLARE @M int,@D int ,@S int ,@R int --新增进货单INSERT INTO purchase_m(purchase_id)VALUES('PUR1')--撷取上一次(进货单)执行T-SQL的错误错误代码SELECT @M = @@ERROR--新增进货明细INSERT INTO purchase_d(purchase_id,seq,prod_id,QTY)VALUES('PUR1','1','PROD1',100)--撷取上一次(进货明细)执行T-SQL的错误错误代码SELECT @D = @@ERROR--异动库存UPDATE stockSET QTY = QTY + 100WHERE prod_id = 'PROD1'--撷取上一次(产品库存)执行T-SQL的错误错误代码SELECT @S = @@ERROR--撷取上一次(产品库存)执行T-SQL的异动笔数SELECT @R = @@ROWCOUNT--之后来做判断,看是否三次执行T-SQL的错误都为0--最后一个@R是判断产品的库存量是否有被异动成功IF @M = 0 AND @D = 0 AND @S = 0 AND @R = 1--没问题就确认交易完成,资料也会在这时候确认新增和修改COMMIT TRANSACTIONELSE--若是有问题就取消交易,让资料不被这三段T-SQL所影响ROLLBACK TRANSACTION
Function:
1.@@ERROR
撷取最后一次执行T-SQL的错误代码,成功执行会回传0。
2.@@ROWCOUNT
撷取最后一次执行T-SQL的异动笔数。