Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 使用转义引号将SQL数据库批量导出到CSV_Sql Server_Batch File_Csv - Fatal编程技术网

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

Sql server 使用转义引号将SQL数据库批量导出到CSV,sql-server,batch-file,csv,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,co

我正在寻找一种将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或管道符号,但这并不能解决真正的问题:无论分隔符是什么,如果它存在于数据中,它将导致导出文件不可用


那么,如何使用标准SQL工具(如BCP、sqlcmd或类似工具)批量将数据导出到工作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的其他方法:

将其设置为固定宽度或手动添加引号分隔符。这两个目标都可以通过以下方式实现:

例如,您的观点是

SELECT C1, '"' + REPLACE(C2,'"','\"') + '"' As C2 FROM YourTable
然后在BCP中从该视图中选择,C2将以引号分隔,数据中的引号将用\r转义

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

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

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

BCP " select quotename(quotedCol,CHAR(34)),quotename(secondCol,CHAR(34))from 
testdb.dbo.table_1" queryout temp.csv -c -T -S. -t","
给定的值介于引号和它生成的def之间: 这是引号之间的,def 根据csv quidelines,我认为这是正确引用/转义的


来源:

我找到了一个解决方案,通过以下方式正确编码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。没有那么复杂。

txt也可以,但您的解决方案也有相同的问题:如果表项中存在分隔符|、项分隔或行分隔\n会发生什么情况?BCP不会转义这些字符,因此您的解决方案将与我的解决方案存在相同的问题,它只会在不同的字符上失败。您可以选择一个最不可能出现在数据中的字段分隔符。已经看到使用*作为字段分隔符的解决方案接收端只使用单字符分隔符-并且不太可能在下周二中断:/batch export不允许更改数据库以添加视图。不过,我会尝试在sqlcmd中使用replace,谢谢。您可以使用查询,但它会变得很混乱。如果不需要可移植,还可以在引用源数据库的其他数据库中创建视图。也许你应该解释一下所有的限制。如果没有一个字段分隔符是可接受的或可靠的,那么唯一的选择就是固定宽度。如果单元格内容被正确引用,它可以从其他程序中使用。固定宽度有换行问题,接收应用程序需要正确的csv,而不是固定宽度。SSIS包是一个选项吗?是的,这种引用正是我要找的!但当然,我的字段内容包含换行符,并且长度超过128个字符-对于更长的列,不是也有类似的情况吗?我认为SSIS可以正确处理这个问题,但显然id不能。可以获得适当的输出,但需要一个自定义的[column transform]函数,因此实际上它与@ElectricLlama所建议的相同。如果您可以定义自定义函数,也许这会起作用我还没有测试过它:我找到了一个使用powershell的解决方案,它包含一个csv编写器,可以创建正确编码的csv文件,也可以使用大字符串:您应该将此作为答案发布,@Sam