2012-08-27 520 views
16

サイズが1.4GBの.csvファイルから大量のデータをデータベースにロードしようとしました。しかし、自分のコードを実行しようとするとエラーが発生します。私はstockquotesのたくさんのデータベースを構築しようリンクサーバー "(null)"のOLE DBプロバイダ "BULK"から行をフェッチできません

USE [Intradata NYSE] 
GO 
CREATE TABLE CSVTest1 
(Ticker varchar(10) NULL, 
dateval date NULL, 
timevale time(0) NULL, 
Openval varchar(10) NULL, 
Highval varchar(10) NULL, 
Lowval varchar(10) NULL, 
Closeval varchar(10) NULL, 
Volume varchar(10) NULL 
) 
GO 

BULK 
INSERT CSVTest1 
FROM 'c:\intramerge.csv' 
WITH 
(
FIELDTERMINATOR = ',', 
ROWTERMINATOR = '\n' 
) 
GO 
--Check the content of the table. 
SELECT * 
FROM CSVTest1 
GO 
--Drop the table to clean up database. 
DROP TABLE CSVTest1 
GO 

は、ここに私のコードです。しかし、私は、このエラーメッセージが表示されます:

メッセージ4832、レベル16、状態1、行2バルクロード: ファイルの予想外端は、データファイルで発生しました。メッセージ7399、レベル16、状態1、 行2リンクサーバー "(null)"のOLE DBプロバイダー "BULK"がエラー を報告しました。プロバイダは についての情報を何も提供していません。メッセージ7330、レベル16、状態2、行2は、リンクサーバー OLE DBプロバイダ「BULK」から行をフェッチできませんが「(ヌル)」

私はSQLの多くを理解していないが、私はキャッチしたいと考えてものか二つ。誰かが非常に明白かもしれないことを誰かが見てほしいと思う

答えて

4

CSVで区切られたフィールドの数がテーブルの列の数と異なる場合、同じエラーが発生しました。適切な数のフィールドがintramerge.csvにあるかどうか確認してください。

1

これは古い質問でしたが、私の発見は同様の問題を抱えている他の人々を魅了すると思われます。

デフォルトのSSISタイムアウト値は30秒​​です。これにより、パッケージ内のサービスバインドまたはIOバウンド操作がそのタイムアウト値を超えてタイムアウトになります。そのタイムアウト値を増やす(タイムアウトがない場合は "0"に変更する)と、問題が解決されます。

11

私は同じ問題がありました。

ソリューション:

は、メモ帳+などのテキストエディタでCSVまたはテキストファイルを確認してください。最後の行は不完全かもしれません。それを除く。

9

古い質問を復活が、場合には、これは他の誰かを助け:多くの試行錯誤の後に私が(ついに!)最終的だったこれを変更することにより、このエラーを取り除くことができ:

ROWTERMINATOR = '\n' 

へこの:

ROWTERMINATOR = '0x0A' 
+1

これは私のために働いた。また、CMDで 'more'コマンドを実行して、フッタや問題の大きいファイルの終わりを調べることをお勧めします。 'more + n [filename]'を実行すると、CMDは 'n'の後のすべての行を表示します。これを使ってファイルの終わり近くを調べます。 – rjmd

2

私形式のファイル(すなわちFORMATFILEのparamを使用して指定)は、実際の列サイズ(例えばvarchar(50)代わりvarchar(100)の)よりも小さかった列幅を持っていたとき、私はこのエラーを得ました。

+0

私の場合と同様、 'int'データ型を' bigint'に変更することで問題は解決します。しかし、私はこれが 'オーバーフロー'エラーを引き起こすはずだと思います。 – Athafoud

+0

私と同じです。列のサイズは何もしませんが、フォーマットファイルはすべて間違っています。 –

1

私のSQLテーブルのcharフィールドが、入ってくるテキストに対して小さすぎる場合、この例外が発生しました。カラムを大きくしてみてください。

0

これは、完全な1.5ギガバイトと悪い考えかもしれませんが、あなたは、サブセット(数行で始まる)でそれを試すことができます。

CREATE TABLE CSVTest1 
(Ticker varchar(MAX) NULL, 
    dateval varchar(MAX) NULL, 
    timevale varchar(MAX) NULL, 
    Openval varchar(MAX) NULL, 
    Highval varchar(MAX) NULL, 
    Lowval varchar(MAX) NULL, 
    Closeval varchar(MAX) NULL, 
    Volume varchar(MAX) NULL 
) 

...BULK INSERTを実行してから

SELECT MAX(LEN(Ticker)), 
    MAX(LEN(dateval)), 
    MAX(LEN(timevale)), 
    MAX(LEN(Openval)), 
    MAX(LEN(Highval)), 
    MAX(LEN(Lowval)), 
    MAX(LEN(Closeval)), 
    MAX(LEN(Volume)) 

これは、見積もりがオフの場合に役立ちます。また、列の順序が間違っているか、BULK INSERTが何らかの理由で失敗する可能性があります。

関連する問題