2010-08-19 103 views
3

我有一個csv文件,其中的列值被括在雙引號內。SQL Server 2008中的CSV導入

我想使用sql語句從網絡路徑導入csv文件。

我試過批量插入。但它與雙引號一起進口。是否有任何其他方式通過忽略文本限定符雙引號使用sql語句將csv文件導入到SQL Server 2008中?

感謝 -Vivek

回答

3

您可以使用non-xml format file爲每列指定一個不同的分隔符。對於用雙引號括起來並用製表符分隔的值,分隔符可以是\",\"。您必須添加一個初始未使用的列來捕獲第一個報價。例如,要讀取該文件:

"row1col1","row1col2","row1col3" 
"row2col1","row2col2","row2col3" 
"row3col1","row3col2","row3col3" 

您可以使用此格式文件:

10.0 
4 
1 SQLCHAR 0 50 "\""  0 unused "" 
2 SQLCHAR 0 50 "\",\"" 1 col1 "" 
3 SQLCHAR 0 50 "\",\"" 2 col2 "" 
4 SQLCHAR 0 50 "\"\r\n" 3 col3 "" 

(第一行的數量依賴於SQL Server版本在第二行中的數字是列數閱讀。不要忘記調整它

bulk insert命令接受一個formatfile = 'format_file_path'參數,你可以指定格式文件。例如:

BULK INSERT YourTable 
FROM 'c:\test\test.csv' 
WITH (FORMATFILE = 'c:\test\test.cfmt') 

這導致:

select * from YourTable 
--> 
col1  col2  col3 
row1col1 row1col2 row1col3 
row2col1 row2col2 row2col3 
row3col1 row3col2 row3col3 
+0

請問您是否仍然會在您的第一個字段中留下一個雙引號,並在最後一個字段中加上一個尾部雙引號? – 2010-08-19 21:09:49

+0

@Joe Stefanelli:您可以在未使用的字段中捕獲前導引號,並在最後一個字段的終止符中引用尾部引號。我測試了我發佈的示例,並且它適用於SQL Server 2008(具有BCP版本10.0) – Andomar 2010-08-19 21:35:37

+0

+1很好。我不會想到使用一個未使用的領域的領先報價。 – 2010-08-19 21:41:33

2

這是一個已知的問題與文字分隔符導入文件時的BCP/BULK INSERT實用工具不允許您指定文本分隔符。請參閱this link進行良好的討論。

0

@ Andomar的anaswer了我的方式出現99%有非常類似的問題。但是,我發現SQL Server 2014無法導入最後一行,因爲最後一個字段沒有新的行字符:\r\n。 所以我的格式文件看起來更像是:

12.0 
4 
1 SQLCHAR 0 50 "\"" 0 unused "" 
2 SQLCHAR 0 50 "\",\"" 1 col1 "" 
3 SQLCHAR 0 50 "\",\"" 2 col2 "" 
4 SQLCHAR 0 50 "\"" 3 col3 "" 

所以我的文件,其中有字段名的行,導入SQL變成了:

BULK INSERT MyTable 
FROM 'C:\mypath\datafile.csv' 
WITH (
    FIRSTROW = 2, 
    FORMATFILE = 'C:\mypath\formatfile.cfmt', 
    ROWTERMINATOR = '\r\n' 
) 

實際CSV過40場,因此有助於閱讀Microsoft's website,它沒有必要寫列名(col1-col40工作得很好),並且在每個行中的第四個參數50只是需要是最大字段長度的,不確切。