非常にトリッキーな形式の.txtファイルから値をMS SQLテーブルに一括ロードしようとしています。以下の例は、ファイルの最初の 2 つのセクションを示していますが、これはファイル全体で 100 回以上繰り返されます。ヘッダーは、各セクションの上部に配置されます。これを処理する方法はありますか?列自体は固定長ですが、テーブルから値を取得してヘッダーを無視するように SQL に指示できる必要があります。アイデアはありますか?
ファイル形式の例:
前もって感謝します。
非常にトリッキーな形式の.txtファイルから値をMS SQLテーブルに一括ロードしようとしています。以下の例は、ファイルの最初の 2 つのセクションを示していますが、これはファイル全体で 100 回以上繰り返されます。ヘッダーは、各セクションの上部に配置されます。これを処理する方法はありますか?列自体は固定長ですが、テーブルから値を取得してヘッダーを無視するように SQL に指示できる必要があります。アイデアはありますか?
ファイル形式の例:
前もって感謝します。
BULK INSERT
bcp.exe または不要な行を除外できるコマンドには、パラメーターまたはフィルターはありません。そのため、前処理または後処理を行う必要があります。
前処理を使用すると、入力ファイルを解析し、一括挿入へのクリーンな入力として機能する別のファイルを出力するのに最適な言語でツールを作成できます。
後処理では、ファイルをそのまま SQL Server (不要な行を含む) にロードし、不要な行をテーブルから削除します。必要に応じて、このために中間 (一時) テーブルを使用することができます。
まず、一括挿入で使用するフォーマット ファイルを作成します。あなたの入力から、固定サイズ形式を使用できるように見えますが、これはこの場合に適しています。date
テーブルの「END on」列に列を使用して、エラーを無視することができます。他の行には有効な日付形式が含まれていないように見えるため、これを粗いフィルターとして使用できます。(n)(var)char 列のみを使用するテーブル定義が必要になる他のすべての方法。
このようなテーブルを使用すると、次のように、ファイルをロードしてWHERE
からフィルターを使用して、データを実際のテーブルに転送するときに無効なものを削除できます。
INSERT INTO MyRealTable
SELECT CHOC_ID, EndOn, ...
FROM #TempBulkTable
WHERE CHOC_ID NOT IN ('untime', '---------------', ...)
または、一括挿入で指定して、フィルタリングを行うトリガーをFIRE_TRIGGERS
テーブルに与えることもできますが、それは一括挿入の目的を少し無効にします。INSTEAD OF INSERT
一時テーブルを使用する場合は、tempdb に十分なスペースがあることを確認してください。
これがあなたにいくつかの有用なアイデアを与えることを願っています.