2012-05-02 167 views
1

我有一個數據庫,其中存儲過程的數量是非常高的。但是有一些存儲過程沒有在存儲過程級別啓動事務。如何SQL Server存儲在存儲過程中的SQL語句

現在我想把交易,這些存儲過程以自動方式。目前我正在使用PowerShell來執行此操作。

但問題是,我可以得到存儲過程的定義,但我不能得到單個SQL語句在存儲過程中,這樣我可以寫一些事務回滾/提交條件

例如,如果上述交易失敗@@errorcount <> 0 then rollback

任何人都可以請讓我知道如何做到這一點,還是有其他的方法來做到這一點?如果我可以分裂SQL語句(這是在存儲過程中)我可以寫在PowerShell的登錄操作的存儲過程

請幫

在此先感謝

+2

這聽起來像一個非常糟糕的主意。我不會以編程方式執行此操作。編寫能夠決定放置這些語句的適當位置的邏輯非常困難。除此之外,最安全的方法是綁定到Visual Studio中的查詢分析器引擎,並讓它解析過程代碼並將其分解爲單獨的語句。 –

+0

另外,你是如何從數據庫中提取存儲的proc代碼?你不使用源代碼控制系統? –

+0

在proc中添加大量的BEGIN TRAN-COMMIT TRAN邏輯通常會導致更多的阻塞,並可能導致命令超時和更頻繁的死鎖。如果COMMIT被遺漏在某個地方,那麼交易可以保持開放並且不會被提交,直到通過某種方式(可能強行)關閉連接並且所完成的工作被丟棄並丟失。如果你正在編程創建新的'樣板'CRUD程序,那將是一回事,但我必須投入第三次(第四次)投票。這不是你最好的主意。 –

回答

0

它們被存儲爲文本,所以要檢查甚至改變身體的陳述,你需要一個parser。你可能會get somewhere使用也用於由Visual Studio(Microsoft.Data.Schema.ScriptDom.dllMicrosoft.Data.Schema.ScriptDom.Sql.dll),它可與您的Visual Studio安裝,並且可以redistributed解析器。我目前正在使用它們來檢查某些SQL腳本是否包含任何「不允許的」SQL語句(當然,在我自己的上下文中不允許),它似乎工作。

有了這樣說,我會通過@RobertLDavis所作的評論表示贊同,認爲這可能不是那麼容易,因爲它的外觀和更好的不自動完成。此外,你無論如何審查所有的變化。因此,你可能可以首先手動完成它們。