2008-08-28 66 views
5

這是我正在使用的sql 2000數據庫。SQL 2000'TRY CATCH like'錯誤處理

我有我稱之爲數據原始數據轉儲的臨時表,所以一切都是ntext或nvarchar(255)。

我需要強制轉換/轉換所有的數據到相應的數據類型(即INT,小數,NVARCHAR等)

我要做到這一點的方法是通過迭代使用的所有記錄while循環並在每次迭代期間在單個記錄上的每列上嘗試CAST,在訪問特定記錄之後,我將其標記爲已處理(位字段)。

但是,如何在發生/如果發生錯誤時記錄錯誤,但允許while循環繼續。

起初,我在本地SQL 2005實例中使用TRY CATCH實現了此目的,並且所有工作都很順利,但今天我瞭解到國際DBA設置的dev &生產數據庫是一個SQL 2000實例,所以我必須遵守。

編輯:我正在使用SSIS包來填充登臺表。我看到現在我必須重新訪問該包並實施腳本組件來處理轉換。謝謝你們

編輯:我上午這樣一條記錄被記錄的基礎,而不是批量插入,所以交易的想法似乎將是可行的,但我不知道如何捕獲@@ ERROR並允許存儲過程繼續。

編輯:我真的很喜歡Guy's approach,我打算用這種方式實現它。

回答

2

一般來說,我不喜歡的解決方案「通過備案循環」,因爲他們往往是緩慢的,你最終編寫大量的自定義代碼。

所以......

根據多條記錄如何在你的臨時表,你可以用一系列測試列正確性和標記測試失敗的任何記錄的SQL語句的後期處理數據。

UPDATE staging_table 
SET status_code = 'FAIL_TEST_1' 
WHERE status_code IS NULL 
AND ISDATE(ntext_column1) = 0; 

UPDATE staging_table 
SET status_code = 'FAIL_TEST_2' 
WHERE status_code IS NULL 
AND ISNUMERIC(ntext_column2) = 0; 

etc... 

最後

INSERT INTO results_table (mydate, myprice) 
SELECT ntext_column1 AS mydate, ntext_column2 AS myprice 
FROM staging_table 
WHERE status_code IS NULL; 

DELETE FROM staging_table 
WHERE status_code IS NULL; 

和分級表有所有的錯誤,你可以導出和報表輸出。

2

你用什麼來導入文件? DTS具有可用於數據驗證的腳本功能。如果您不使用DTS,您是否使用自定義工具?如果是的話,那你在那裏做驗證

但我認爲這是你的期望。
http://www.sqlteam.com/article/using-dts-to-automate-a-data-import-process

IF @@Error <> 0 
GOTO LABEL 

@op
在SSIS中的「紅線」從數據導入任務可以壞行重定向到一個單獨的目的地或變換。我有一段時間沒有玩過它,但希望它有幫助。

1

看起來你註定了。見this文件。

TL/DR:數據轉換錯誤總是導致整個批處理被中止 - 不管你做什麼,你的sql腳本都不會繼續執行。交易無濟於事。您不能檢查@@ ERROR,因爲執行已經中止。

我會首先重新檢查爲什麼你需要一個臨時數據庫完整的varchar(255)列 - 可以填充數據庫做任何轉換嗎?

如果不是,我想你需要編寫一個程序/腳本來從varchar列中進行選擇,轉換並插入到prod數據庫中。

1

在事務中運行每個強制轉換,每次強制轉換後,檢查@@ ERROR,如果清除,提交併繼續。

1

您可以嘗試在投射前檢查數據類型並實際避免投擲錯誤。

您可以使用類似功能:

 
ISNUM - to check if the data is of a numeric type 
ISDATE - to check if it can be cast to DATETIME