2008-08-28 8 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のインスタンスので、私は準拠する必要があります。

EDIT:SSISパッケージを使用してステージングテーブルを作成しています。私は今、パッケージを再訪し、変換を処理するためのスクリプトコンポーネントを実装する必要があることを知っています。みんなありがとう

EDIT:私は午前レコード単位ではなく、バッチ挿入によって記録にこれをやって、それが可能になるように、取引アイデアはようだが、私はわからないどのようにトラップ@@ ERRORへストアドプロシージャを続行することができます。

EDIT:私は実際に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を使用していない場合は、カスタムツールを使用していますか?もしそうなら、そこであなたの検証を行います。

しかし、これはあなたの探しているものだと思います。 SSISで
http://www.sqlteam.com/article/using-dts-to-automate-a-data-import-process

IF @@Error <> 0 
GOTO LABEL 

@op
データインポートタスクからの「赤線」とは、別の宛先に悪い行をリダイレクトまたは変換することができます。私はしばらくそれをしていないが、それが助けてくれることを願っている。

1

あなたは運命にあるようです。 thisのドキュメントを参照してください。

TL/DR:データ変換エラーにより、バッチ全体が強制終了されます.SQLスクリプトは、何をしても実行を続行しません。トランザクションは役に立ちません。実行はすでに中止されているため、@@ ERRORをチェックすることはできません。

私はまず、varchar(255)列でいっぱいのステージングデータベースが必要であることを再検証します。

もしそうでなければ、varcharカラムから選択し、変換し、prod dbに挿入するプログラム/スクリプトを書く必要があるでしょう。

1

各キャストをトランザクションで実行し、各キャスト後に、@@ ERRORをクリア、コミット、移動する場合はチェックします。

1

キャストする前にデータ型をチェックして、実際にエラーを投げないようにすることができます。彼らは遅くなる傾向があり、カスタムコードの多くを書いてしまうと一般的に、私は解決策「のレコードをループし、」好きではない

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

関連する問題