2012-07-12 81 views
1

我有一個更新兩個表的存儲過程。第一個表始終是相同的表,但是這取決於所傳入的一個參數的第二個表的變化。它是更有效的它寫成一個大procudure,這樣更新多個表的存儲過程

CREATE PROCEDURE MyBigProc 
    @id int 
    @param int, 
    @value1 int, 
    @value2 int 
AS 
BEGIN 
    SET NOCOUNT ON; 

    -- First table to update 
    UPDATE MyTable SET field1 = @value1 WHERE id = @id 

    -- Then choose which table to update based on @param 
    IF @param = 1 
     UPDATE MySecondTable SET field2 = @value2 WHERE id = @id 

    IF @param = 2 
     UPDATE MyThirdTable SET field2 = @value2 WHERE id = @id 
END 

或者我應該寫一爲每個表分別執行程序,然後從主程序中調用EXEC程序。

我想後者更靈活,比如說如果我想更新一個子表而不是主表?

回答

1

我想後者更靈活,比如說如果我想更新一個 子表,但是沒有主表?

沒錯,你有一個很好的理由把工作分成兩個獨立的過程。如果對你來說一切都合情合理,我不明白爲什麼不這樣做。

不這樣做的一個可能原因是,如果您需要兩個更新同時成功或失敗。在這樣的情況下,我會將所有內容放在一個proc中,並將所有內容都放在一個事務中。

+0

換句話說,如果我把事情分開,那麼有可能第一次表更新通過,但第二次表更新失敗。如果第二次更新失敗,是否有辦法回滾第一次更新? – hgcrpd 2012-07-12 04:46:55

+0

@hgcrpd肯定可以在嵌套的存儲過程中回滾更新。檢查此模板以瞭解如何完成它:http://stackoverflow.com/a/2074139/345490。非常簡單:所有特效都必須遵循相同的模板;每個proc在錯誤時回滾並重新確認(請參閱catch塊中的'raiserror'行)錯誤以通知調用者proc已發生錯誤,以便調用者在錯誤時也回滾。 – Icarus 2012-07-12 14:07:47

0

最好有不同的存儲過程,然後在一個地方打電話給他們。在執行維護活動時它會幫助你很多。

0
CREATE PROCEDURE MyBigProc 
    @id int, 
    @param int, 
    @value1 int, 
    @value2 int 
AS 
BEGIN 
    SET NOCOUNT ON; 

    -- First table to update 
    UPDATE MyTable SET field1 = @value1 WHERE id = @id; 

    -- Then choose which table to update based on @param 
    IF @param = 1  
     exec SP_MySecondTable @id,@value2; 
    IF @param = 2 
     exec SP_MyThirdTable @id,@value2; 
END 

CREATE PROCEDURE SP_MySecondTable 
    @id int, 
    @value2 int 
AS 
BEGIN 
    UPDATE MySecondTable SET field2 = @value2 WHERE id = @id; 
END 

CREATE PROCEDURE SP_MyThirdTable 
    @id int, 
    @value2 int 
AS 
BEGIN 
    UPDATE MyThirdTable SET field2 = @value2 WHERE id = @id; 
END 
+3

歡迎使用StackOverflow:如果您發佈代碼,XML或數據樣本,**請**在文本編輯器中突出顯示這些行,然後單擊編輯器工具欄上的「代碼示例」按鈕(「{}」)語法突出它!那麼你不需要所有那些醜陋的'
'標籤! – 2012-07-12 05:15:50