2017-06-01 77 views
1

我正在使用SQL Server 2014和BULK INSERT命令引用.csv文件和格式文件。在所有字段(包括列標題)之前,我已經成功完成了這個任務,但是現在數據格式略有改變,並且第一列heade rand數據未包含在double quoutes中,並且在創建格式文件時遇到問題。在CSV中使用BULK INSERTwith格式文件和雙引號的問題

實施例數據...

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 

我已經試過各種分隔符排列與虛擬列第一欄之前去除,第一列(一後Bove是最新的),我仍然收到相同的錯誤信息...

由於文件「\ Mypath \ import_staff_dq.fmt」不完整或無法讀取,無法批量加載。操作系統錯誤代碼(空)。

該文件始終關閉。

我已在DEST表中的所有字段VARCHAR爲簡單起見

+0

BULK INSERT不支持複雜的CSV文件,用換行或引用的字符串,即文件。即將到來的SQL Server 2017年。使用SSIS。您可以使用SSMS中的「導入數據」嚮導來導入CSV數據*和*保存一個SSIS包供重用。最常見的情況是使用SSIS進行導入和轉換,而不是直接使用bcp或BULK INSERT –

+0

它適用於所有字段都用雙引號括起來的成功格式文件('fmt'),但它不是如上所述進行工作,其中第一列未用引號包裹。 –

回答

0

我發現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=';"' 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