2017-06-01 6 views
1

ファイルとフォーマットファイル.csvを参照するSQL Server 2014とBULK INSERTコマンドを使用しています。私はすべてのフィールド(列ヘッダーを含む)がデータフォーマットがわずかに変更され、最初の列のheade randデータが二重引用符で囲まれず、フォーマットファイルを作成する際に問題が発生する前に、このsuccessfulyを実行しました。CSV形式ファイルと二重引用符でBULK INSERTを使用する場合の問題

例データ...

Number of Employees;"Employee - First Name (Key)";"Employee - Last Name (Key)";"Employee - E-Mail Address (Key)" 
1;"Joe";"Bloggs";"[email protected]" 

注、セミコロンがフィールドセパレータと最初の列ヘッダーとデータが全く引用符を持っていない、以下のすべてのヘッダとデータを行うと、実施例FMT

一致していますフォーマットファイル...

12.0 
5 
1  SQLCHAR    0  0  "\"" 0  ""               "" 
2  SQLCHAR    2  50  ";" 1 "Number of Employees"          Latin1_General_CI_AS 
3  SQLNCHAR   2  510  "\";\"" 2 "Employee First Name"          Latin1_General_CI_AS 
4  SQLNCHAR   2  510  "\";\"" 3  "Employee Last Name"          Latin1_General_CI_AS 
5  SQLNCHAR   2  510  "\"\r\n" 4  "E-Mail Address"            Latin1_General_CI_AS 

私は(最初の列の前と後に、取り外したダミーの列の最初の列にAを区切り順列のすべての種類を試してみましたBOVEは最新のもの)と、ファイル「\ MYPATH \ import_staff_dq.fmt」が不完全であるか、読み取ることができませんでしたので、私はまだ

は、バルクロードすることはできません...同じエラーメッセージが表示されます。オペレーティングシステムのエラーコード(null)。

ファイルは常に閉じます。

私は私が理解し、作成しやすいように、XML形式のファイルを見つけるシンプル

+0

BULK INSERTが複雑なCSVファイル、改行や引用符で囲まれた文字列を持つ、すなわちファイルをサポートしていません。 。これはSQL Server 2017に入っています。これにはSSISを使用します。 SSMSの 'Import Data'ウィザードを使用してCSVデータをインポートし、再利用のためにSSISパッケージを保存することができます。最も一般的なシナリオは、インポートおよび変換にSSISを使用することです.bcpまたはBULK INSERT –

+0

は、すべてのフィールドが二重引用符で囲まれていても正常に使用されていますが、対応する形式ファイル( 'fmt')で動作します。最初の列が引用符で囲まれていない上記のように動作します。 –

答えて

0

ためVARCHARにdestのテーブル内のすべてのフィールドを設定しました。

<?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=';"' MAX_LENGTH="10"/> 
    <FIELD ID="2" xsi:type="CharTerm" TERMINATOR='";"' MAX_LENGTH="4000" COLLATION="SQL_Latin1_General_CP1_CI_AS"/> 
    <FIELD ID="3" xsi:type="CharTerm" TERMINATOR='";"' MAX_LENGTH="4000" COLLATION="SQL_Latin1_General_CP1_CI_AS"/> 
    <FIELD ID="4" xsi:type="CharTerm" TERMINATOR='"\r\n' MAX_LENGTH="4000" COLLATION="SQL_Latin1_General_CP1_CI_AS"/> 
</RECORD> 
<ROW> 
    <COLUMN SOURCE="1" NAME="NumberOfEmployees" xsi:type="SQLNVARCHAR"/> 
    <COLUMN SOURCE="2" NAME="EmployeeFirstName" xsi:type="SQLNVARCHAR"/> 
    <COLUMN SOURCE="3" NAME="EmployeeLastName" xsi:type="SQLNVARCHAR"/> 
    <COLUMN SOURCE="4" NAME="EmailAddress" xsi:type="SQLNVARCHAR"/> 
</ROW> 
</BCPFORMAT> 

使用openrowset(bulk ...)

select * 
from openrowset (
    bulk 'c:\tmp.csv' 
    , formatfile='c:\tmp.xml' 
    , firstrow=2 
) as t 

リターン:

+-------------------+-------------------+------------------+-------------------+ 
| NumberOfEmployees | EmployeeFirstName | EmployeeLastName | EmailAddress | 
+-------------------+-------------------+------------------+-------------------+ 
|     1 | Joe    | Bloggs   | [email protected] | 
+-------------------+-------------------+------------------+-------------------+ 

参考:


私もそうなどの非XML形式のファイルを使用して同じ結果を得ることができています:

12.0 
4 
1 SQLCHAR 0 0 ";\""  1 NumberOfEmployees Latin1_General_CI_AS 
2 SQLCHAR 0 0  "\";\"" 2 EmployeeFirstName Latin1_General_CI_AS 
3 SQLCHAR 0 0  "\";\"" 3 EmployeeLastName Latin1_General_CI_AS 
4 SQLCHAR 0 0  "\"\r\n" 4 EmailAddress  Latin1_General_CI_AS 
+0

ありがとう、それは素晴らしい作品 –

+0

@KevinM助けて嬉しいです! – SqlZim

関連する問題