使用转义引号将SQL数据库批量导出为CSV

时间:2014-06-12 09:09:07

标签: sql-server batch-file csv

我正在寻找一种批量导出SQL Server表到csv文件的方法。

有一些解决方案使用sqlcmd或bcp,但到目前为止,我找不到任何正确转义引号,逗号或换行符的解决方案。

例如,此命令会创建一个不错的csv,但会忽略使csv文件无法使用的引号和逗号:

bcp MyDatabase..MyTable out c:\test.csv -c -T -t, -r\n -S MYPC

从我的四行样本数据中,每行包含一些其他特殊字符,这将创建一个这样的文件:

1,contains " quote
2,contains , comma
3,contains ; semi
4,contains ' single quote

由于引号和逗号,其他程序无法导入。当然我可以将分隔符更改为制表符或管道符号,但这并不能解决真正的问题:无论分隔符是什么,如果它存在于数据中,它将使导出文件无法使用。

那么如何使用标准SQL工具(如BCP,sqlcmd或类似工具)将批量数据批量导出到正常工作的csv文件?

4 个答案:

答案 0 :(得分:4)

使用quotename应该正确转义引号(但它限制为最多128个字符,没有换行符):

BCP " select quotename(quotedCol,CHAR(34)),quotename(secondCol,CHAR(34))from 
testdb.dbo.table_1" queryout temp.csv -c -T -S. -t","

给定值this is "between quotes"def会产生:
"this is ""between quotes""","def" 根据csv quidelines,我认为这是正确引用/转义的。

来源:http://social.technet.microsoft.com/wiki/contents/articles/4666.sql-server-bcp-utility-experts-guide.aspx#Use_Text_Qualifier_on_BCP_Output

答案 1 :(得分:1)

使其固定宽度或手动添加引号分隔符。这两个都可以通过视图实现

例如,您的观点将是

SELECT C1, '"' + REPLACE(C2,'"','\"') + '"' As C2 FROM YourTable

然后你在BCP中从这个视图中选择,C2将被引用分隔,并且数据中的引号将被转义为\(主要是)

使其固定宽度只是另一个字符串表达式,它使用适当的填充来连接字段。

您可以在BCP中使用查询,但我不确定您是如何逃避引号的(!)无论您做什么,这些引用都是一种痛苦。

答案 2 :(得分:1)

我找到了一个解决方案,可以in another Stackoverflow answer正确编码csv文件Iain Elder

他使用PowerShell导出正确的csv:

Import-Module -Name SQLPS
$cd = Get-Location
Invoke-Sqlcmd -Query "SELECT * FROM DimDate;" `
              -Database AdventureWorksDW2012 `
              -Server localhost |
Export-Csv -NoTypeInformation `
           -Path "$cd\DimDate.csv" `
           -Encoding UTF8

他的解决方案也正确编码分隔符,换行符,引号和长篇内容。

我仍然觉得很奇怪,没有其他出口似乎正确支持csv。 并不复杂。

答案 3 :(得分:-1)

是否必须是csv?我通常更喜欢使用txt文件来避免这种问题。

     bcp MyDatabase..MyTable out c:\test.csv -c -T , -r\n -S MYPC

如果您有可能使用其他分隔符,请尝试

     bcp MyDatabase..MyTable out c:\test.csv -c -t| -T, -r\n -S MYPC   

此处描述了实现格式良好的csv的其他方法:https://www.simple-talk.com/sql/database-administration/creating-csv-files-using-bcp-and-stored-procedures/