2

現在、ルーチンRUNS DAILYがあり、数十のフラットテキストファイルをfoxproにインポートしています。これをTSQLに変換する作業をしています。コマンドを使用していBULK INSERTます。

数十のフラットファイルごとにSQLコマンドとXMLファイルを作成しました(フォーマットごとに1つ)。

ファイルごとに、コマンドラインから次のような変換を呼び出します。

sqlcmd -d MYDB -i Import_FILEA.sql -o Output_FILEA.txt

それはうまく機能します(それが機能するとき)。問題は、データが送信前にデータを検証しないソースからのものであるということです。私は彼らを責めません。私はこれらのことがどのように起こり得るかを知っています。しかし今、私はその場にいます。

私のSQLスクリプトは次のようになります。

SET LANGUAGE us_english;
GO
SET DATEFORMAT ymd;
GO
DELETE FROM [MyDB].[dbo].[FILEA];
GO
BULK INSERT 
  [MyDB].[dbo].[FILEA]
  FROM 'C:\Documents and Settings\somewhere\FILEA.DAT'
  WITH
  (
  DATAFILETYPE ='CHAR',
  FORMATFILE='C:\Documents and Settings\somewhere\translate_FILEA.xml',
  ERRORFILE ='C:\Documents and Settings\somewhere\ERR_FILEA.TXT',
  LASTROW   = 400000
  )
GO

LASTROW引数はデバッグのみを目的としています。問題は、これが失敗すると、完全に失敗し、問題の原因となっている行またはフィールドを教えてくれないことです。エラーファイルは作成されません。作成された場合は、すぐに破棄されます。(ファイルが作成されてから消えるのを見ることができます-最悪のことです。)

文字フィールドではないごく少数のフィールドをチェックするために、perlスクリプトまたは正規表現を使用してコンパイルされたvbaを作成したいということにとてもイライラしています。それは小さなことですが、それは余分です-そして私は次の人がそれを維持することを心配しています。(他の人がperlでプログラムしたり、.netの正規表現に精通しているとは思いません)さらに、MSDNのドキュメントではbulk insert、エラーファイルの問題行を報告する必要があるようです。

何か案は?これは既知の問題ですか?欠落しているパラメーターはありますか?これを回避する別の方法はありますか?または、外部データ形式チェッカーは正しい方法ですか?

4

1 に答える 1

0

エラーファイルが役に立ちません。この問題には 2 つの解決策があります。

(A) perl スクリプトを作成して実行し、インポートを実行する前に各フラット ファイルのデータ フィールドを解析およびチェックします。

(B) すべてをテキスト フィールドとして読み込みますが、各 BULK INSERT の後に UPDATE SET コマンドを介して設定される正しいデータ型の追加フィールドがあります。

私が最初に思いついたオプション (A) と、データ プロデューサーに自動メールを送信できるため、現在はオプション (A) を使用しています。

于 2012-06-06T16:20:06.533 に答える