4

1 列のテキスト ファイルを SQL テーブルの 1 つにインポートしたいと考えています。このファイルは単なる悪口のリストです。

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

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

ただし、予期しないファイルの終わりでエラーが発生します。インポート先のテーブルは、テキストを挿入したい nvarchar フィールドが続く ID フィールドです。テキスト ファイルの "1" を各行の先頭に追加すると問題なく動作します。これは、SQL が 2 つのフィールドを検索するためだと思います。これを回避する方法はありますか?

ありがとう

4

7 に答える 7

10

これには 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.

詳細については、フォーマット ファイルの使用を参照してください。

于 2009-06-16T14:58:22.967 に答える
2

これは、KEEPIDENTITY 引数の下の BULK INSERT に関するオンラインの書籍で説明されています。これが言うことです

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

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

于 2009-06-16T15:09:25.707 に答える
1

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

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

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

BULK INSERT vw_SwearWords FROM 'c:\swearwords.txt' WITH (ROWTERMINATOR = '\n')
于 2009-06-16T14:57:19.160 に答える
0

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/

于 2012-06-27T04:54:11.953 に答える
0

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

于 2009-06-16T14:53:55.597 に答える
0

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

于 2009-06-16T14:56:23.890 に答える
0

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

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

マルク

于 2009-06-16T14:51:04.230 に答える