解決辦法一:
在begin transaction 前面加set xact_abort on
這樣就可以在過程出錯時中斷執行,當然也就不能commit了
如此再在最後乙個操作的後面加入 if @error=0 就說明所有的操作都執行成功了
就可以 commit
具體如:
set xact_abort on
begin trans
declare ...
<1>操作
<2>操作
...操作
if @error<>0
begin
rollback transaction
endelse
begin
commit transaction
endend
解決辦法二:
不加 set xact_abort on 而是宣告乙個記錄錯誤的變數
比如:begin trans
declare @nror int
set @nror=0
<1>操作
set @nror=@nror+@@error
<2>操作
set @nror=@nror+@@error
...操作
set @nror=@nror+@@error
if @ror<>0
begin
rollback transaction
endelse
begin
commit transaction
endend
顯然這樣在每乙個操作的背後都要加入乙個記錄錯誤的操作
最後再判斷錯誤是不是0,如果不是則說明過程中某一步出了錯,就不commit了。
這比第一種方法在煩一點,
create procedure order_down_forjoin2
@result varchar(50) output,
@orderno varchar(50),
@out_trade_no varchar(50),
@product_class varchar(50),
@brand varchar(50),
@product_no varchar(30),
@product_size varchar(50),
@color varchar(100),
@color2 varchar(100),
@number int,
@price money,
@area varchar(50),
@city varchar(50),
@county varchar(50),
@address varchar(200),
@zip varchar(20),
@username varchar(50),
@phone varchar(50),
@mobile varchar(50),
@email varchar(100),
@joinno varchar(50),
@isems int,
@ems money,
@send varchar(400),
@memo text,
@sendinfo1 varchar(50),
@sendinfo1time datetime,
@sendinfo varchar(50),
/*庫存的更新*/
@number55 int,
@number2 int,
@number3 int,
@number4 int,
@number5 int,
/*庫存記錄的插入*/
@number222 int,
@stock varchar(50),
@operation_type varchar(50),
@operation varchar(50),
@memo_product_inout_record text,
@users varchar(50),
/*備用金的更新*/
@checks varchar(16),
@lastprice money,
@memo_protect_log text,
@server varchar(50),
@disprice_class varchar(50),
@disprice money,
@price2 money
asbegin transaction
declare @nror int
set @nror=0
insert into tbl_order
(orderno,out_trade_no,product_class,brand,product_no,product_size,color,color2,price,area,city,county,server,address,zip,username,phone,email,memo,joinno,isems,ems,send,sendinfo1,sendinfo1time,sendinfo,mobile,disprice,disprice_class)
values
(@orderno,@out_trade_no,@product_class,@brand,@product_no,@product_size,@color,@color2,@price,@area,@city,@county,@server,
@address,@zip,@username,@phone,@email,@memo,@joinno,@isems,@ems,@send,@sendinfo1,@sendinfo1time,@sendinfo,@mobile,@disprice,@disprice_class)
set @nror=@nror+@@error
update tbl_product_store set number=number-@number55,number2=number2-@number2,number3=number3-@number3,number4=number4-@number4,number5=number5-@number5
where product_no=@product_no and color=@color and product_size=@product_size
set @nror=@nror+@@error
insert into tbl_product_inout_record
(product_no,color,product_size,number2,stock,users,operation_type,operation,memo)
values (@product_no,@color,@product_size,0-
@number,@stock,@users,@operation_type,@operation,@memo_product_inout_record)
set @nror=@nror+@@error
update tbl_protect set price=@lastprice ,checks=@checks where joinno=@joinno
set @nror=@nror+@@error
insert into tbl_protect_log (joinno,orderno,price,product_no,memo) values (@joinno,@orderno,0-@price2,@product_no+'-'+@color+'-'+@product_size,@memo_protect_log)
set @nror=@nror+@@error
if @nror<>0
begin
set @result='失敗'
rollback transaction
endelse
begin
set @result='成功'
commit transaction
endgo
vc 中,ado執行sql server儲存過程
variant t recordsaffected string szsql string p ks adduser m szname m szpasswd trycatch com error e catch com error e 必須指定執行sql語句的commandtype是adcmdsto...
SQLServer 2005中列所有儲存過程方法
為了查詢這些儲存過程,你可以花時間在網際網路搜尋,檢視一些你還未知道的儲存過程,也許在一兩個小時您可能會發現你想要.也許你很幸運的找到,其他人在他們的文章中列出所有的儲存過程 函式和檢視,並介紹了如何使用這些儲存過程。但其實,您可以在一分鐘之內就可以自己列出這些儲存過程 函式和檢視的清單 這份名單甚...
在asp中呼叫sql server的儲存過程
在asp中呼叫sql server的儲存過程可以加快程式執行速度,所以這些天在研究asp中利用sql server的儲存過程,現總結如下,其中很多思想也是直接從chinaasp論壇中得出來,希望能給大家一些幫助。1.呼叫儲存過程的一般方法 先假設在sql server中有一儲存過程dt users ...