2016-11-12 12 views
2

この表はどのように見えるかです:認識できないdatetime形式のCSVをインポートするにはどうすればよいですか?

CREATE TABLE [dbo].[temptable] 
    (
     [id] [nvarchar] (50) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL , 
     [datetime] [datetime] NOT NULL, 
     [status] [nvarchar] (50) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, 
     [col4] [money] NULL, 
     [col5] [float] NULL, 
     [col6] [money] NULL, 
     [col7] [float] NULL, 
     [col8] [money] NULL, 
     [total] [money] NOT NULL 
    ) 

これは、CSVはどのように見えるかです:

10.0 
4 
1 SQLCHAR 0 50 "," 1 sale_id "" 
2 SQLDATETIME 0 8 "," 2 sale_datetime "" 
3 SQLCHAR 0 50 "," 3 sale_status "" 
4 SQLMONEY 0 8 "\n" 9 grand_total "" 

SQL:

"ID","Date","status","Total" 
"1611120001","12/11/2016 10:06 AM","closed","8.15" 
"1611120002","12/11/2016 10:14 AM","closed","21.25" 
"1611120003","12/11/2016 10:24 AM","closed","10.75" 
"1611120004","12/11/2016 10:39 AM","closed","10.90" 
"1611120005","12/11/2016 10:46 AM","closed","30.10" 
"1611120006","12/11/2016 11:04 AM","closed","7.40" 

これは私の形式のファイルがどのように見えるかですスクリプト:

SET DATEFORMAT dmy 
BULK INSERT temptable 
    FROM 'C:\backup\temp.csv' 
    WITH 
    (
    FIRSTROW = 2, 
    FIELDTERMINATOR = ',', 
    ROWTERMINATOR = '\n', 
    FORMATFILE = 'C:\backup\temp_format.txt' 
    ) 

私はスクリプトを実行しようとしたとき、私はこのエラーを取得しています:

をメッセージ4864、レベル16、状態1、行2

バルクロードデータ変換エラー(のための型の不一致または無効な文字指定されたコードページ)を行2の列2(datetime)に格納します。

私は datetimeこの 12/11/2016 10:06 AMような日付の形式を受け入れないだろうと思うが、このCSVファイルは、サードパーティのソフトウェアによって作成されたので、私は何ができるのでしょうか?

+3

がそれをインポートdatetimeの文字列を受け取ったステージングテーブルに入れ、最後の場所へのデータのサニタイズとコピーを処理する別のプロセスを持っていますか? – Igor

答えて

1

BULK INSERTは、ファイルのdatetime形式を処理すると考えられます。問題はフォーマットファイルの仕様です。以下を行う必要があります。

  • が最初 フィールドの引用フィールドエンクロージャのためのダミーフィールドを指定
  • (ファイルではなく、 テーブルについて説明)すべてのファイルのフィールドのSQLCHARを指定引用フィールドを指定しますフィールドターミネータのエンクロージャ

キャリッジリターンと改行文字の両方で行が終了する場合は、最後のフィールドターミネータとして "\" \ n \ "の代わりに" \ "\ r \ n"を指定します。

指定されたデータのフォーマットファイルは次のようになります。

10.0 
5 
1 SQLCHAR 0 0 "\""  0 field1   "" 
2 SQLCHAR 0 0 "\",\"" 1 sale_id  "" 
3 SQLCHAR 0 0 "\",\"" 2 sale_datetime "" 
4 SQLCHAR 0 0 "\",\"" 3 sale_status "" 
5 SQLCHAR 0 0 "\"\n" 9 total   "" 

形式のファイルは、フィールドと行ターミネータを指定しているので、あなたがBULK INSERTの文からこれらのキーワードを省略することができます。

BULK INSERT temptable 
FROM 'C:\backup\temp.csv' 
WITH 
    (
     FIRSTROW = 2, 
     FORMATFILE = 'C:\backup\temp_format.txt' 
    ); 
+0

あなたが提供するフォーマットファイルを試してみましたが、このメッセージが届きました(0行が影響を受けます) – vbnewbie

+0

@vbnewbie、フォーマットファイルと質問のデータデータを含むファイルを正常にテストしました。列が改行文字で終わることはありません。テキストエディタでファイルを表示して行ターミネータを確認します。終了文字は、Unix形式のフォーマットではx "0A"、標準のWindowsファイルではx "0D0A"になります。 –

+0

ありがとう、やっと終わった。私がしたのはあなたのフォーマットファイルで\ nを削除するだけです – vbnewbie

関連する問題