2013-04-01 78 views

回答

10

你可以把你的兩個語句爲TRY....CATCH塊,只承諾如果兩個語句成功:

BEGIN TRANSACTION 
BEGIN TRY 
    DELETE FROM dbo.MYTABLE WHERE [email protected]; 

    INSERT INTO dbo.MYTABLE (ID, NAME) 
     SELECT @ID, NAME 

    -- COMMIT only if both DELETE and INSERT worked .... 
    COMMIT TRANSACTION 
END TRY 
BEGIN CATCH 
    SELECT 
     ERROR_NUMBER() AS ErrorNumber, 
     ERROR_SEVERITY() AS ErrorSeverity, 
     ERROR_STATE() AS ErrorState, 
     ERROR_PROCEDURE() AS ErrorProcedure, 
     ERROR_LINE() AS ErrorLine, 
     ERROR_MESSAGE() AS ErrorMessage 

    -- ROLLBACK if either DELETE and INSERT failed .... 
    ROLLBACK TRANSACTION 
END CATCH 
+0

只回滾一行。其餘的人都不見了:(我們可以在存儲過程的整個生命週期中這樣做嗎? – NoviceDeveloper

+0

這就是你的sp的整個生命週期。如果你正在談論多次運行sp並且將它們全部回滾錯誤,那麼你應該改變你的進程來處理數據行而不是行 – HLGEM

+0

嗯我使用表值參數,現在它正在wroking所以這只是一行.. – NoviceDeveloper

0

這裏是另一種方式來完成你看起來是在嘗試:

update myTable 
set name = @name 
where id = @id 
+0

雖然這是一個好方法,但它是更新,我正在尋找一種特定的方式來刪除並插入運行我的存儲過程。 – NoviceDeveloper

0
BEGIN TRAN 

Delete from MYTABLE where [email protected]; 

INSERT INTO MYTABLE (ID, NAME) 
SELECT @ID, NAME 

if @@error = 0 and @@trancount > 0 
    commit 
else 
    rollback 
+0

這是不正確的,並使用shoudl不再使用的語法現在我們有TRYCATCH塊,如果delte失敗,它將不會回滾,如果你使用@@ error,你必須在每個語句後檢查它。 – HLGEM

+0

這是不正確的。如上所述解決了問題。問題陳述是在插入失敗的情況下回滾刪除,因此僅在調用插入後才進行檢查。 Try..catch也可以使用,但沒有必要。 –

2

打開xact_abort以回滾任何錯誤的事務。

SET XACT_ABORT ON; 
BEGIN TRAN 
Delete from MYTABLE where [email protected]; 

INSERT INTO MYTABLE (ID, NAME) 
SELECT @ID, NAME 

COMMIT TRAN 
相關問題