web-dev-qa-db-ja.com

リンクサーバー "(null)"のOLE DBプロバイダー "BULK"から行をフェッチできません

1.4 GBのサイズの.csvファイルから大量のデータをデータベースにロードしようとしています。しかし、コードを実行しようとするとエラーが発生します。

ここに私のコードがあります:

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 OLEリンクサーバー "(null)"のDBプロバイダー "BULK"はエラーを報告しました。プロバイダーはエラーに関する情報を提供しませんでした。メッセージ7330、レベル16、状態2、行2 OLEリンクサーバー "(null)"のDBプロバイダー "BULK"から行をフェッチできません

私はSQLの多くを理解していませんが、1つか2つキャッチしたいと思っています。非常に明白なことを誰かが見てほしい。

17
Espen Skeie

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

ROWTERMINATOR = '\n'

これに:

ROWTERMINATOR = '0x0A'
14
starkos

同じ問題がありました。

解決:

Notepad +などのテキストエディターでCSVまたはテキストファイルを確認します。最後の行は不完全な場合があります。それを除く。

12
Anil Kumar C

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

6
Tim Partridge

フォーマットファイル(つまりFORMATFILE paramを使用して指定)の列幅が実際の列サイズよりも小さい場合(たとえばvarchar(50)ではなくvarchar(100))にこのエラーが発生しました。 。

2
Chris Staley

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

1
mikelus

それは古い質問でしたが、私の発見は、同様の問題を抱えている他の人々を啓発するようです。

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

1
HOKBONG

これは1.5GBのフル容量では悪い考えかもしれませんが、サブセットで試してみることができます(数行から開始)。

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
)

...一括挿入を実行してから、

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が他の何らかの理由で失敗する場合もあります。

0
Gary

これに対する私のソリューションを共有したいだけです。問題はテーブルの列のサイズで、varchar(255)を使用すればすべてが機能するはずです。

0
Master Yi

これが私の解決策です。あきらめるだけです。

私はいつもSSMSと[ Tasks > Import Data ]

neverを使用して、この方法を使用してインポートする実際の.csvファイルを取得できました。これはまったく役に立たない関数であり、実世界には存在しない初期のデータセットでのみ機能します。おそらく、私が扱うデータセットは非常に乱雑であり、サードパーティによって生成されているため、運がなかったのでしょう。

そして、それがうまくいかない場合、それは理由に関する手がかりを与えません。マイクロソフト、あなたはこの分野でのあなたの完全な無能に私を悲しませました。

マイクロソフトは、おそらくいくつかのエラーメッセージを追加するので、why拒否しましたか?なぜ失敗したのかわからない場合、問題を解決することはほとんど不可能だからです!

0
Contango