質問

1列のテキストファイルをSQLテーブルの1つにインポートしたい。このファイルは単なる誓言のリストです。

これを行うために次のTSQLを作成しました

BULK INSERT SwearWords
FROM 'c:\swears.txt'
WITH
(
FIELDTERMINATOR = ',',
ROWTERMINATOR = '\n'
)

ただし、予期しないファイルの終わりでエラーが発生します。インポート先のテーブルは、IDフィールドにテキストを挿入するnvarcharフィールドが続くだけです。テキストファイルに「1」を追加すると正常に機能します。 eveyr行の先頭まで、これはSQLが2つのフィールドを探しているためだと思います。これを回避する方法はありますか?

ありがとう

役に立ちましたか?

解決

これにはFORMATFILEを使用する必要があります。 一括挿入を参照してください。

  

FORMATFILE [= 'format_file_path']

     

フォーマットのフルパスを指定します   ファイル。データを記述するフォーマットファイル   保存された応答を含むファイル   上のbcpユーティリティを使用して作成   同じテーブルまたはビュー。フォーマットファイル   次の場合に使用する必要があります。

* The data file contains greater or fewer columns than the table or view.

* The columns are in a different order.

* The column delimiters vary.

* There are other changes in the data format. Format files are usually created by using the bcp utility and modified with a text editor as needed. For more information, see bcp Utility.

詳細については、フォーマットファイルの使用

他のヒント

これは、KEEPIDENTITY引数の下でのBULK INSERTの行の本で説明されています。これが言うことです

  

守秘義務   インポートされたファイルにID列の値が存在することを指定します。 KEEPIDENTITYが指定されていない場合、インポートされたデータファイルのこの列のID値は無視され、SQL Serverはテーブル作成中に指定されたシード値と増分値に基づいて一意の値を自動的に割り当てます。データファイルにテーブルまたはビューのID列の値が含まれていない場合、フォーマットファイルを使用して、データのインポート時にテーブルまたはビューのID列をスキップするように指定します。 SQL Serverは自動的に列に一意の値を割り当てます

したがって、フォーマットファイルを使用するか、ダミー値を指定して、KEEPIDENTITY引数を使用しないようにしてください

また、nvarchar列のみに基づいてテーブルにビューを作成し、ビューに一括挿入することもできます。これは、BULK INSERTを使用する非常にクリーンな方法です。

この方法により、IDENTITY列やフォーマットファイルの作成について心配する必要がなくなります。

BULK INSERTステートメントは次のようになります。

BULK INSERT vw_SwearWords FROM 'c:\swearwords.txt' WITH (ROWTERMINATOR = '\n')

テキストファイルとテーブルの構造が一致することを確認する必要があります-テーブルに2つのフィールドがある場合、テキストファイルにも2つのフィールド/列を提供する必要があります。

SQLテーブルの最初の列はIDENTITYフィールドであるため、任意の値を指定できます-ただし、値を設定する必要があります。これを回避する方法はないと思います。

マーク

最後の行にCR / LF(\ r \ n)があることを確認します。それが問題になることもあれば、ファイルの最後に余分なキャリッジリターンがある場合もあります。 hexeditorで確認できます。

ID列を削除し、完了したら元に戻すことができます。または、データベースの関係が壊れた場合、一度だけのインポートであればDTSまたはSSISを使用してインポートを実行できます。列をいじるのよりきめ細かい制御

SQL Server 2008では、多くの挿入を含むファイルを作成し、それをManagement Studioのクエリウィンドウに貼り付ける方が、フォーマットファイルと一括挿入ファイルのアクセス許可を適切に取得するよりも簡単です。 :

USE YourDB
GO
INSERT INTO MyTable (FirstCol, SecondCol)
VALUES ('First',1),
('Second',2),
('Third',3),
('Fourth',4),
('Fifth',5)

http://blog.sqlauthority.com/2008/07/02/sql-server-2008-insert-multiple-records-using-one-insert-statement-use-of-row -constructor /

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top