将数据从 SQL Server Express 导出到 CSV(需要引用和转义)

Posted

技术标签:

【中文标题】将数据从 SQL Server Express 导出到 CSV(需要引用和转义)【英文标题】:Exporting data from SQL Server Express to CSV (need quoting and escaping) 【发布时间】:2011-11-15 00:28:42 【问题描述】:

我花了 2 天时间尝试从 SQL Server 安装中导出一个包含用户输入数据的大文本字段的 75,000 行表。此数据包含每个纯 ascii 字符、制表符和换行符。我需要导出 CSV,其中每个字段都被引用,并且引用列中的引号被正确转义(“”)。

这是我迄今为止尝试过的: - 右键单击​​ Management Studio 中的数据库并导出到 Excel:由于字段太长而失败。 - 数据从 Management Studio 导出到带有 " 文本分隔符和逗号分隔符的平面文件 - 完全没用,不会在字段中转义引号,从而使文件完全不明确。 - 命令行中的 BCP - 也不支持引用字段。

我需要使用 FasterCSV ruby​​ 库导入。它不允许引号分隔符是非标准的 ascii 字符或多个字符。它也不允许在未引用的列中使用 \n 或 \r。

非常感谢任何帮助。

【问题讨论】:

你可以直接从 ruby​​ 程序连接到 sql server 并跳过导出/导入步骤吗?您可以使用 ruby​​-DBI 包来连接 select * 并根据需要引用它。 @Doon 可能值得研究。如果我可以使用 Ruby 连接并获得结果,我也许可以使用 FasterCSV 导出有效的 CSV。我无法从外部客户端进行连接,因为我在一台具有严格权限的机器上工作,该机器不允许远程连接到 SQL 服务器。 如果您使用的是 SQL Server 2012 connect.microsoft.com/SQLServer/feedback/details/735714,您可能会遇到此问题 此解决方案详解:***.com/questions/6115054/… How to get export output in "real" CSV format in SQL Server Managment Studio?的可能重复 【参考方案1】:

我们制作了一个小脚本来将 SSMS“损坏”的 CSV 转换为正确的 CSV,在这个答案中找到它:

https://***.com/a/46876236/1532201

【讨论】:

【参考方案2】:

我发现的最简单的解决方案是在查询中添加双引号;

SELECT '"'+MYCHARACTERDATA+'"' FROM MYTABLE

如果您的电子表格允许您使用自定义文本限定符,那么您可以使用更奇特的字符,例如 |避免在文本中出现双引号。

Daft..SSMS 应导出为正确的 CSV,其中包含带引号的文本字段并在这些字段中正确转义引号。

【讨论】:

【参考方案3】:

我能想到的最佳解决方案是选择所有行并复制到 XML。

将其粘贴到记事本文件中并将其保存为 XML 文件。 然后从 excel 中打开该 XML 文件,瞧!至少我是如何得到我的文件的。

【讨论】:

【参考方案4】:

Robert Calhoun 的解决方案对我不起作用。我们有很多带有逗号和回车/换行符等的文本。 我们使用了导出功能,并对上面 Chris Christodoulou 的解决方案进行了一些更改。

在 SQL Management Studio 中,右键单击数据库并选择任务 -> 导出数据。

然后选择 SQL Server 作为源和平面文件作为目标。将文件命名为 MyFile.csv。

将文本限定符设置为“

选择“编写查询以指定数据传输”并粘贴到您的查询中。 您可以将下一个设置保留为默认值。

导出数据后,用 Excel 打开并保存为 Excel 格式。

【讨论】:

天啊..!!!!如此接近..预览完美无缺,但在实际导出期间我收到此错误:错误 0xc020802e:数据流任务 1:“目标 - testttttt_csv.Inputs[平面文件目标输入].Columns[Main_Content]”的数据类型是 DT_NTEXT , ANSI 文件不支持。改用 DT_TEXT 并使用数据转换组件将数据转换为 DT_NTEXT。 (SQL Server 导入导出向导)【参考方案5】:

最简单的方法:

使用 Excel 数据导入工具

转到数据 > 从其他来源 > 从 Sql Server 填写服务器名称等 选择要导入的表或视图。

然后将导入的数据保存为 CSV 文件。 如果要导出查询,请将查询另存为视图

【讨论】:

这是对原始问题的解决方案。它在本地对我有用,但是由于安全限制,我有一个无法以这种方式与 Excel 连接的数据库。 :-( 我有一堆带有引号、换行符、奇怪字符等的数据。这是有效的答案。谢谢你。 (但应该注意,我必须将列选择到 newTable 中,以便 excel 可以看到表而不是结果集) 是的,创建一个视图并导出它,而不是运行一些 SQL 并制作一个临时报告。这是我认为的最佳做法。【参考方案6】:

我很好奇为什么没有人建议在这个过程中使用 SSIS(SQL Server 集成服务)?从 SSMS (SQL Server Management Studio) 中导入/导出的所有向导和工具绝对不是全面的(当然它们也不是,是的,有很多微软应该回答的限制)。但 SSIS 是一个功能非常齐全的 ETL 工具,旨在完全解决此类问题。学习曲线可能有点陡峭,但将表格导出到逗号/引号分隔的 csv 文件并不是特别难。

可能需要为 Visual Studio 添加此插件,以便有一个开发环境来创建包:http://www.microsoft.com/en-us/download/details.aspx?id=42313 (链接适用于 VS 2013,其他链接适用于其他版本的 VS)。

【讨论】:

这是最好的解决方案,但是当您想要快速而肮脏的一次性复制到 Excel 时,感觉就像是费了很大力气。不应该这么难!【参考方案7】:

我也一直在尝试解决这个问题。不确定这是否适合你,因为你的桌子比我的大得多,但这是我一时兴起的:

    我通过 SELECT * 声明在 Express 中拉起了我的桌子 只需选择结果行并 Ctrl + C 打开 Excel 突出显示我粘贴的表格的列数 已粘贴,而且效果很好! 现在只需将 Excel 导出为 CSV 即可。

我知道这听起来可能很愚蠢,但它确实对我有用。

【讨论】:

这个答案真的应该被赞成。我比 OP 更震惊,这确实有效。因为生产服务器没有安装 Excel 或其他任何东西,所以我在远程桌面上为 170 K 行的表做了它。所以我进入来宾 RDP 系统,运行 SQL,复制行,然后返回运行 RDP 会话的主机系统并粘贴到 OpenOffice。通过 RDP 流式传输剪贴板数据大约需要 10 分钟,我不得不稍微拖动 OpenOffice 以使其在之后重绘,但它确实有效并产生了转义数据。悲伤但真实。 我想补充一点,我希望微软工程师每天都能被踢脸。 很遗憾,这没有被标记为答案,因为这绝对有效。在我的情况下,从 SSMS 导出并没有正确地使用换行符转义字符串。在 Excel 中复制/粘贴然后导出就是答案,因为它可以更好地处理 CSV。 这是完美的解决方案,这样所有乱码的问题都没有了,不知道为什么用sql server导出会导致特殊字符的错误解释。谢谢ckpepper02 最简单的事情是最难的解决方案。干得好!【参考方案8】:

可以的!但是,您必须专门配置 SSMS 以使用带引号的输出,因为某些愚蠢的原因它不是默认值。

在您要保存的查询窗口中转到查询 -> 查询选项...

选中“保存 .csv 结果时引用包含列表分隔符的字符串”框。

然后

select 'apple,banana,cookie' as col1,1324 as col2,'one two three' as col3,'a,b,"c",d' as col4

会输出

col1,col2,col3,col4
"apple,banana,cookie",1324,one two three,"a,b,""c"",d"

这是我们都想要的。

【讨论】:

如果你的数据有带引号但没有逗号的字段,***.com/questions/14573623/… 有一个可以工作的 Ruby 方法(FasterCSV 不行) 请注意,此解决方案适用于特定查询。您可以在“工具”>“选项”>“查询结果”>“SQL Server”>“结果到网格”>“在保存 .csv 结果时引用包含列表分隔符的字符串”中为所有查询设置默认值 这不适用于包含换行符的文本字段。 这看起来不错,但它并不总是转义双引号 (")。这个答案中的情况很好,但我尝试了SELECT '"'SELECT 'a"',在这两种情况下,值都是使用 SQL Server Management Studio 2014 逐字输出的。这绝对是一个有用的答案,但我对它投了反对票因为它只在某些情况下有效,因此可能会给依赖它的人带来问题。 @jrothenbuhler - 新行的事情很痛苦,所以我编写了一个程序来进行导出。 github.com/deeja/SQLtoCSV/releases【参考方案9】:

这是我用来执行此操作的脚本的精髓:

require 'rubygems'
require 'active_record'
require 'tiny_tds'
require 'activerecord-sqlserver-adapter'
require 'acts_as_reportable'
require 'ruport'

ActiveRecord::Base.logger = Logger.new("log/debug.log")
ActiveRecord::Base.establish_connection(
  :adapter    => 'sqlserver',
  :mode       => 'dblib',
  :dataserver => 'servername',
  :username   => 'username',
  :password   => 'password',
  :timeout    => '60000'
)

class Table1 < ActiveRecord::Base
  set_table_name 'table_name'
  set_primary_key 'table_id'
  acts_as_reportable
end

Table1.report_table(:all).save_as("finished/table1.csv")

希望对你有帮助!

【讨论】:

【参考方案10】:

也许下面的链接可以帮助你:

Import/Export data with SQL Server 2005 Express

【讨论】:

不幸的是,这没有帮助。 SQL Server Express 附带的所有工具都会创建无效的 CSV。

以上是关于将数据从 SQL Server Express 导出到 CSV(需要引用和转义)的主要内容,如果未能解决你的问题,请参考以下文章