2013-04-30 79 views
6

.csvファイルから非常に大きなデータセットをSQL Server 2012データベースにダンプしようとしています。何千ものINSERTを行うのではなく、私はbcpを調べています。BCPはエラーを返さず、行もコピーしません。

編集:これは自動化されたプロセスであり、単発ではありません。このデータベースには、BULK INSERTの権利もありません。 bcp私はデータベースにデータをコピーしようとするとエラーは返されませんが、実際には何もコピーされません。ちょうど0 rows copiedが返されます。私はこれを最小限のケースにまで縮小してしまいました。

まず、2つのカラムを持つ簡単なテーブルを作成します。

CREATE TABLE [dbo].[mincase](
    [key] [varchar](36) NOT NULL, 
    [number] [int] NOT NULL 

    PRIMARY KEY CLUSTERED 
    (
     [key] ASC 
    ) 
    WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, FILLFACTOR = 40) ON [PRIMARY] 
) ON [PRIMARY] 

GO 

を次に、この形式のファイルを作成するためにbcpを使用しています。この例ではXML形式のファイルを作成しますが、これがXMLであるかネイティブであるかは関係ありません。

bcp MyDB.dbo.mincase format nul -T -n -f mincasexml.fmt -x -S .\SQLEXPRESS 

ここで、1行と2つのエントリをタブ区切りにしてdata.csvファイルを作成します。私の場合、ファイルは単純です:

somecharacters 12345 

ここでも、それはタブではなく、二つの空間だし、末尾の改行があるか否かは関係していないようです。

今、このファイルからデータを挿入するためにその形式のファイルでbcpを使用しよう:

Starting copy... 

0 rows copied. 
Network packet size (bytes): 4096 
Clock Time (ms.) Total  : 1 

、誰もが知っています:

bcp MyDB.dbo.mincase in data.csv -f mincasexml.fmt -T -S .\SQLEXPRESS 

ではなく、データベースにデータをコピー、私はこれを取得します何が起きてる?

ありがとうございます!

+0

あなたはIMPORT DATAオプションを試しましたか? –

答えて

8

bcpコマンドでは、通常、bcpファイルのフォーマットモードを指定する識別子が必要です。

  • -cは
  • -nは、あなたのテストケースでUnicodeモード

を指定する-wネイティブモード

  • を指定する文字(平文)モードを指定し、作成したファイルは平文であり、あなたので、コマンド内のbcpに '-c'を指定する必要があります。列の値内に現れるフィールド区切り文字の問題を回避するために、輸入と輸出のための「-n」を使用して

    bcp MyDB.dbo.mincase in data.csv -c -T -S .\SQLEXPRESS 
    

    Microsoft Recommends(文字モードとネイティブモードのベストプラクティスのセクションを参照してください)。

  • +1

    これはそれでした。マイナーな編集:-fは-cをオーバーライドしました。フォーマットファイルを削除すると、問題は非常にきれいに解決されました。最終結果は 'bcp MyDB.dbo.mincase in data.csv -c -S。\ SQLEXPRESS' – Mark

    +1

    大変です。私の答えを固定しています。 –

    1

    すでにフォーマットファイルを使用していたことを除いて、同様の問題が発生しました。そのため、フォーマットフラグの1つを追加することは役に立ちません。ここで終わる他の人のために、私はこの問題の原因を説明したいと思います(うまくいけば根本的な問題の原因を説明するのに役立ちます)。

    問題は、BCPがファイル内のテキスト行を実際に処理しないことです。むしろ、それはあなたがそれを与える指示に従って、データストリームを処理するだけです。 これは、あなたが(偶然に)BCPにすることであるならば、改行は無視されることを意味します。私の場合は

    、これは形式ファイルの最後の行にタイプミスであることが判明:

    13.0 
    1348 
    1 SQLCHAR 0 21 "," 1 RecordKey "" 
    2 SQLCHAR 0 30 "," 0 SubmissionKey "" 
    3 SQLCHAR 0 1 "," 2 A1cLvl "" 
    ... 
    1347 SQLCHAR 0 1 "," 0 WoundIntVac "" 
    1348 SQLCHAR 0 1 "/r/n" 0 XClampTm "" 
    

    よく見ると、あなたはスラッシュが上のターミネータフィールドに後ろ向きになります表示されます最後の行したがって、Windowsスタイルの行末を探す代わりに、BCPは実際にはデータストリーム内のテキスト文字列 "/ r/n"を探していました。

    文字列が実際にデータに表示されなかったため、BCPは実際には最終フィールドに一致するものを実際に見つけたことはありませんでした。したがって、コピーするには「0行」が見つかりました。

    これが「予期しないEOFに遭遇しました」というエラーなどの原因にならない理由はまだ分かりませんが、他の誰かがこれを拡張できるようになります。

    関連する問題