我有一個csv文件,其中的列值被括在雙引號內。SQL Server 2008中的CSV導入
我想使用sql語句從網絡路徑導入csv文件。
我試過批量插入。但它與雙引號一起進口。是否有任何其他方式通過忽略文本限定符雙引號使用sql語句將csv文件導入到SQL Server 2008中?
感謝 -Vivek
我有一個csv文件,其中的列值被括在雙引號內。SQL Server 2008中的CSV導入
我想使用sql語句從網絡路徑導入csv文件。
我試過批量插入。但它與雙引號一起進口。是否有任何其他方式通過忽略文本限定符雙引號使用sql語句將csv文件導入到SQL Server 2008中?
感謝 -Vivek
您可以使用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
這是一個已知的問題與文字分隔符導入文件時的BCP/BULK INSERT實用工具不允許您指定文本分隔符。請參閱this link進行良好的討論。
@ 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
只是需要是最大字段長度的,不確切。
請問您是否仍然會在您的第一個字段中留下一個雙引號,並在最後一個字段中加上一個尾部雙引號? – 2010-08-19 21:09:49
@Joe Stefanelli:您可以在未使用的字段中捕獲前導引號,並在最後一個字段的終止符中引用尾部引號。我測試了我發佈的示例,並且它適用於SQL Server 2008(具有BCP版本10.0) – Andomar 2010-08-19 21:35:37
+1很好。我不會想到使用一個未使用的領域的領先報價。 – 2010-08-19 21:41:33