将数据从 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(需要引用和转义)的主要内容,如果未能解决你的问题,请参考以下文章