2013-02-11 69 views
4

我正在做一個存儲過程,其中多個表插入和更新依賴於它們之前的插入。我是否需要做任何事情來確保這些操作完成(如提交),或者插入存儲過程中,調用總是完成並按順序完成,而我什麼也不擔心?第二個sql調用依賴於另一個

回答

2

你擔心什麼,你就需要去關注的,如果說你正在創建一個永久表(非臨時/非變量表),並打算做鑲入的唯一方案它之後。要通過運行時錯誤指示表不存在,您必須在創建表之後但在插入記錄之前放置「GO」。之後,您可以使用「GO」命令確保所有過程命令都已完成,然後再繼續執行任何代碼,但在大多數情況下不需要。如果你執行一個插入,然後在插入完成之後不應該評估更新邏輯後立即執行更新,但是如果你想額外確定一下,只需在它們之間插入一個「GO」,然後就可以毫無疑問。

1

如果您有幾條語句,並且要確保它們全部完成,或者沒有一條完成,那麼您應該使用事務。插入或更新語句可能會失敗的原因很多,因此檢查是一個好主意。

在您發言前使用BEGIN TRANSACTION,之後使用COMMIT TRANSACTION。如果您想取消批次中已完成的任何工作,也可致電ROLLBACK TRANSACTION

將這些語句包裝在TRY/CATCH塊中以嘗試正常處理任何錯誤。

BEGIN TRY 
    BEGIN TRANSACTION 
     --insert/update statements go here 
    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; 

    IF @@TRANCOUNT > 0 
     ROLLBACK TRANSACTION;  
END CATCH 
+0

好點,你應該總是有適當的錯誤處理來補償運行時錯誤/失敗,但是在乾淨的場景中,SQL操作按照它們寫入的順序完成。這就是爲什麼它是一種腳本語言,而不是面向對象。 – 2013-02-11 15:24:12

+0

感謝你們倆。由於缺少處理該數據庫的錯誤,因此我需要更多地使用提交。 我認爲'去'聲明會給我一些想法,但它聽起來像我不需要它。 – KenK 2013-02-11 15:36:06

+0

我是新來的stackoverflow-我應該標記爲答案或只有最相關? – KenK 2013-02-11 15:37:31

相關問題