繁体   English   中英

将带转义引号的SQL数据库批量导出到CSV

[英]Batch export SQL database to CSV with escaping quotes

我正在寻找一种将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

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

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

使用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产生:
我相信根据CSV quidelines "this is ""between quotes""","def"被正确地引用/转义了。

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

使其固定宽度或手动添加引号定界符。 两者都可以通过以下方式实现

例如,您的观点是

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

然后在BCP中从此视图中选择,C2将用引号定界,并且数据中的引号将用\\进行转义(大多数情况下)

为了使其具有固定的宽度,这只是另一个字符串表达式,它使用适当的填充符将字段连接在一起。

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

我找到了一种解决方案,可以 Iain Elder的 另一个Stackoverflow答案中正确编码csv文件:

他使用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。 那么复杂。

一定要是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/

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM