none
BULK INSERT フォーマットファイル使用し、UNICODEファイルが取り込めない。 RRS feed

  • 質問

  • SQL SERV2008 R2のストアドでの質問です。

    CSVファイルからテーブルに取り込まないフィールドが有り、フォーマットファイルにてフィールドをスキップさせようとしています。

    その前段で「テーブルフィールド数=CSVファイルの項目数」の時、SJIS時は正常に取り込まれるのですがUNICODEにすると取り込まれません。

    その際のストアドにエラーメッセージは出力されません。

    以下がストアドです。

    /******************************************************************/

      SET @cSQL =N'BULK INSERT dbo.T_TEST' +
         N' FROM ''' + @FullPath + '''' +
          N' WITH (DATAFILETYPE = ''widechar''' + ',' +  
           'FORMATFILE = ''' + @vcFmtFile + '''' + ',' +  
           'FIRSTROW = 2)'

      EXECUTE @iCHK= sp_executesql @cSQL, N''

    /******************************************************************/

    以下はファイルフォーマットです。(bcpコマンドによりxml形式で作成)

    <?xml version="1.0"?>
    <BCPFORMAT xmlns="http://schemas.microsoft.com/sqlserver/2004/bulkload/format" xmlns:xsi=http://www.w3.org/2001/XMLSchema-instance
     <RECORD>
      <FIELD ID="1" xsi:type="CharTerm" TERMINATOR="\t" MAX_LENGTH="20" COLLATION="Japanese_BIN"/>
      <FIELD ID="2" xsi:type="CharTerm" TERMINATOR="\t" MAX_LENGTH="100" COLLATION="Japanese_BIN"/>
      <FIELD ID="3" xsi:type="CharTerm" TERMINATOR="\t" MAX_LENGTH="100" COLLATION="Japanese_BIN"/>
      <FIELD ID="4" xsi:type="CharTerm" TERMINATOR="\t" MAX_LENGTH="100" COLLATION="Japanese_BIN"/>
      <FIELD ID="5" xsi:type="CharTerm" TERMINATOR="\r\n" MAX_LENGTH="100" COLLATION="Japanese_BIN"/>
     </RECORD>
     <ROW>
      <COLUMN SOURCE="1" NAME="C01" xsi:type="SQLNVARCHAR"/>
      <COLUMN SOURCE="2" NAME="C02" xsi:type="SQLNVARCHAR"/>
      <COLUMN SOURCE="3" NAME="C03" xsi:type="SQLNVARCHAR"/>
      <COLUMN SOURCE="4" NAME="C04" xsi:type="SQLNVARCHAR"/>
      <COLUMN SOURCE="5" NAME="C05" xsi:type="SQLNVARCHAR"/>
     </ROW>
    </BCPFORMAT>

    /******************************************************************/

    ネットで検索するとフォーマットファイル使用に於けるUNICODEの使用は面倒な設定等は無いように見受けられるのですが原因が解りません。

    (DATAFILETYPE=widecharに設定する位かなと...)

    アドバイスを頂けないでしょうか?

    以上、よろしくお願いいたします。

    2016年2月26日 4:24

回答

  • ERRORFILEを指定しても何も出力されませんでした。

    ネットで検索すると海外で関連する内容が出ていました。

    http://www.sqlteam.com/forums/topic.asp?TOPIC_ID=38831

    翻訳しても正確には把握できないのですが、一番下の3行をみると

    フォーマットファイルとUnicodeファイルの両方を使うことが出来ない。

    と、解釈出来るような気がします。

    と言う事で今回はフォーマットファイルを使用した項目のスキップは諦めました。

    ありがとうございました。

    • 回答としてマーク hareru 2016年3月11日 12:38
    2016年3月9日 9:43

すべての返信

  • そもそも質問者さんの言う「UNICODEファイル」とは何でしょうか? Unicode 文字形式を使用したデータのインポートまたはエクスポートには

    Unicode 文字形式のデータ ファイルは、Unicode ファイルの規則に従います。ファイルの先頭の 2 バイトは、16 進数の 0xFFFE です。これらのバイトは、バイト順マークとしての役割を果たし、高位のバイトをファイルの先頭に格納するか、最後に格納するかを指定します。

    と記載されていますが、条件を満たしていますでしょうか? 例えば0xEF 0xBB 0xBFで始まっていたりしませんよね?

    2016年2月26日 5:26
  • 佐祐理さん、回答ありがとうございます。

    サクラエディタで該当のファイルを開いた時に右下に「Unicode BOM付き」と表示されています。

    一応、Windows標準のDebug機能で16進表示をしてみましたところ、先頭2バイトとは

    「FFFE」エフ、エフ、エフ、イー でした。

    以上、よろしくお願いいたします。

    2016年2月26日 8:08
  • 「取り込まれません。」は、エラーにはならないものの、全くinsertされていない(テーブルにはinsert実行前の行しかない)という状況でしょうか?その場合、ERRORFILE = xxx を指定してその内容を見てみると、失敗している理由が分かるかもしれません。

    例えば、データ長が長く、データの右側が切り捨てられるような状況になってしまっているとか。

    2016年3月4日 6:18
  • MKIIIさん、返信ありがとうございます。

    やっと、返信を貰うことができました。

    BULK INSERTでエラー内容の確認が出来ることを知りませんでした。

    早速、ERRORFILEを指定して確認してみます。

    週明けになりますが結果を報告させていただきます。

    以上、よろしくお願い致します。

    2016年3月4日 12:35
  • ERRORFILEを指定しても何も出力されませんでした。

    ネットで検索すると海外で関連する内容が出ていました。

    http://www.sqlteam.com/forums/topic.asp?TOPIC_ID=38831

    翻訳しても正確には把握できないのですが、一番下の3行をみると

    フォーマットファイルとUnicodeファイルの両方を使うことが出来ない。

    と、解釈出来るような気がします。

    と言う事で今回はフォーマットファイルを使用した項目のスキップは諦めました。

    ありがとうございました。

    • 回答としてマーク hareru 2016年3月11日 12:38
    2016年3月9日 9:43