2015-02-06 101 views
0

我寫了一個名爲FooUpsert的存儲過程,它在各種表中插入和更新數據。它需要一些提供數據的數字和字符串參數。這個程序狀態良好,我不想修改它。如何將值從存儲過程中的表參數傳遞到另一個存儲過程?

接下來,我正在編寫另一個存儲過程,該服務器作爲一種批量插入/更新。

該過程作爲一個原子事務來完成它的工作是等價的。一些數據可以插入/更新,有些則不可接受。

在我看來,這樣做的適當方式是設置一個表值過程,比如FooUpsertBulk。我開始用一個表參數編寫這個存儲過程,該參數保存的數據類似於傳遞給FooUpsert的數據,我的想法是我可以一次讀取一行,並調用FooUpsert獲取每行中的值。我意識到這可能不是最佳做法,但再次,FooUpsert已被寫入,加上FooUpsertBulk將一天最多運行幾次。

問題是,在FooUpsertBulk,我不知道如何迭代行並將每行中的值作爲參數傳遞給FooUpsert。我意識到我可以更改FooUpsert以接受表值參數,但我不想重寫FooUpsert

你可以在你身邊的一個SQL忍者那裏請告訴我如何做到這一點?

我的SQL Server是MS-SQL 2008

+1

你將被卡住做這行通過痛苦行.....換句話說慢。無論如何,你將不得不改變你的一個程序。聽起來你必須添加一個**咳嗽**光標**咳嗽**到FooUpsertBulk,以便通過你的基於表的有價值的參數並逐行調用另一個proc。 – 2015-02-06 21:28:51

+0

^^^^完全不同意。無論如何,你必須更新存儲過程。只要讓一個proc在基於集合的操作中完成這兩件事情。 – Zane 2015-02-06 21:34:49

+0

,所以你可以調用'FooUpsertBulk'傳入多行數據,只能在這個過程中循環訪問它們,所以每行調用'FooUpsert'?如果是這樣,那麼和現在的操作有什麼不同呢?並且當前正從另一個proc或應用程序代碼調用FooUpsert? – 2015-02-06 21:36:02

回答

0

結束語各種查詢到一個明確的交易(即BEGIN TRAN ... COMMITROLLBACK)使得它的所有原子操作。您可以:

  • 開始從應用程序代碼中的交易(假設FooUpsert是由應用程序代碼調用),因此必須處理的提交和回滾有作爲。這仍然留下很多小操作,但是單個事務並且不需要更改代碼。

  • 在一個進程開始交易,在包含在一個try/catch這樣就可以處理ROLLBACK如果到FooUpsert任何調用失敗循環中調用FooUpsert

  • 將代碼從FooUpsert複製到新的FooUpsertBulk,該代碼從應用程序代碼接受TVP,並將所有操作都作爲基於集合的操作進行處理。一旦TVP加入查詢,修改FooUpsertBulk中的每個查詢處理各種輸入參數以從TVP表變量中獲取字段。請保留FooUpsert,直到FooUpsertBulk正常工作。

相關問題