2012-10-16 47 views
0

我有一張表,當前正在使用名爲DateFromDateTo的兩列。我試圖用一個NewDate列替換它們,爲現有行填充值爲DateFrom刪除和添加列時正確的錯誤處理

我需要很好的錯誤/事務處理,因爲如果更改失敗,我不想在中間表中間,我想恢復。

我試過很多東西,但無法正常工作。任何幫助表示讚賞,因爲我遠沒有這方面的經驗。

我開始與

BEGIN TRAN 

ALTER TABLE TableName 
ADD NewDate DATETIME 

IF @@ERROR = 0 AND @@TRANCOUNT = 1 
UPDATE TableName 
SET NewDate = ValidFrom 
.... 

這立即未按NewDate當前未在表中的列。很好,所以我在那裏添加一個GO。這分成兩批,現在運行,除了它使@@ERROR檢查毫無意義。我也不能使用局部變量,因爲那些在GO之後也會丟失。理想情況下,我希望使用TRY...CATCH以避免在每次陳述後檢查錯誤,但我無法使用GO,因爲它需要成爲一個批次。

我發現的文章都沒有提到這種情況(使用GO進行錯誤處理)。所以問題是:有沒有任何方式我可以得到我想要添加和更新列(這似乎需要在某處GO)的錯誤處理方法?

或者我將不得不在幾批中解決它,如果出現任何問題,沒有能力回滾到我原來的表格?

+0

在同一事務中執行DDL和DML是麻煩的捷徑。如果要恢復升級,請使用備份。 –

+0

@RemusRusanu所以,把它分成兩部分。有道理,只是想知道我是否不知道一些有用的SQL魔術。 – Alex

+0

整體效果與僅重命名'DateFrom'到'NewDate'並刪除'DateTo'有什麼不同? –

回答

0

爲什麼你擔心在交易中創建新列?只需創建該列,然後填充它。填充它時,甚至不需要顯式傳輸。如果失敗(這不太可能),只需再次進行更新。

我會做以下步驟

  1. 添加新列
  2. 更新新列
  3. 檢查是否在新的列中的數據看起來是正確的
  4. 刪除舊的列不再需要(您可能想要檢查這些列在使用之前所在的位置,例如它們是否用於任何存儲過程,報告,前端應用程序代碼中)

此外,值得爲您的問題添加更多的上下文。我假設你正在測試一個測試數據庫的腳本,並稍後將腳本應用到prod數據庫。 prod數據庫非常大嗎?很忙?關鍵任務?按計劃備份?

+0

是的,我想我是過於複雜的事情。爲了清晰起見,我已經分解了一些內容Prod數據庫不是太大或複雜,並且備份,所以沒有問題。 – Alex

相關問題