2017-06-02 62 views
0

我一直在編寫一個存儲過程。但是現在我不確定我是否做得很好。我有這樣的代碼:帶有多個更新的SQL Server(t-sql)存儲過程

BEGIN 
    UPDATE tblPro 
    SET Email = @p_Email 
    WHERE ProID = @p_proId 

    UPDATE tblVisits 
    SET VisitBrief = 'CONFIRMED' 
    WHERE VisitID = @p_visitId 

    UPDATE Bookings 
    SET JobConfirmation = 1 
    WHERE BookingID = @p_bookingId 

    IF @@ROWCOUNT > 0 
    BEGIN 
     INSERT INTO tblView (ViewLogType) 
     VALUES ('Visit') 
    END 
    ELSE 
     PRINT 'WARNING: Insert Failed' 
END 

是更好地有@@ROWCOUNT > 0每次更新後聲明只是爲了確保所有的語句被執行?

感謝意見

+1

這取決於你。您當前使用的@@ rowcount僅計算受上次更新影響的行。 –

+2

如果因爲目標行不存在而導致上一次更新失敗時需要插入一行,那麼您會這樣做,只有您知道這是否可行。這被稱爲* upsert *,在T-SQL中做這件事的方法是使用'MERGE'。 –

+0

如果您擔心存儲過程的正確性,那麼我會首先將set nocount添加爲第一個語句之一。 – GuidoG

回答

1

如果你想發現錯誤,你可以使用try/catch語句。

如果您想保存行數以備後續使用,則應記錄它們以查找您有興趣保存的語句。即使語句正確執行(行受影響),Rowcount仍然可以爲零。

如果您希望能夠在其中一個語句失敗時進行回滾,那麼也可以使用事務。

+0

謝謝。如果我使用TRY/CATCH並從C#應用程序調用存儲過程,如果發生錯誤,C#中的catch(Exception ex)會捕獲錯誤嗎? – KMR

+0

您可以在SP中使用RETURN語句。 – SAS

+0

我需要使用RETURN語句返回ERROR。請給我看一個例子嗎?非常感謝 – KMR