我想知道是否有一種方法來狀態回滾刪除,如果我不能插入。如果插入失敗,SQL Server存儲過程恢復我的記錄
請指教。
像下面這樣的東西。
BEGIN TRAN
Delete from MYTABLE where [email protected];
INSERT INTO MYTABLE (ID, NAME)
SELECT @ID, NAME
COMMIT
我想知道是否有一種方法來狀態回滾刪除,如果我不能插入。如果插入失敗,SQL Server存儲過程恢復我的記錄
請指教。
像下面這樣的東西。
BEGIN TRAN
Delete from MYTABLE where [email protected];
INSERT INTO MYTABLE (ID, NAME)
SELECT @ID, NAME
COMMIT
你可以把你的兩個語句爲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
這裏是另一種方式來完成你看起來是在嘗試:
update myTable
set name = @name
where id = @id
雖然這是一個好方法,但它是更新,我正在尋找一種特定的方式來刪除並插入運行我的存儲過程。 – NoviceDeveloper
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
這是不正確的,並使用shoudl不再使用的語法現在我們有TRYCATCH塊,如果delte失敗,它將不會回滾,如果你使用@@ error,你必須在每個語句後檢查它。 – HLGEM
這是不正確的。如上所述解決了問題。問題陳述是在插入失敗的情況下回滾刪除,因此僅在調用插入後才進行檢查。 Try..catch也可以使用,但沒有必要。 –
打開xact_abort以回滾任何錯誤的事務。
SET XACT_ABORT ON;
BEGIN TRAN
Delete from MYTABLE where [email protected];
INSERT INTO MYTABLE (ID, NAME)
SELECT @ID, NAME
COMMIT TRAN
只回滾一行。其餘的人都不見了:(我們可以在存儲過程的整個生命週期中這樣做嗎? – NoviceDeveloper
這就是你的sp的整個生命週期。如果你正在談論多次運行sp並且將它們全部回滾錯誤,那麼你應該改變你的進程來處理數據行而不是行 – HLGEM
嗯我使用表值參數,現在它正在wroking所以這只是一行.. – NoviceDeveloper