将数据从 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(需要引用和转义)的主要内容,如果未能解决你的问题,请参考以下文章
如何将远程 SQL Server Express 数据库的部分副本复制到本地 SQL Server Express 数据库?
将数据从 SQL Server Express 导出到 CSV(需要引用和转义)
使用 WebMatrix 将数据库从 SQL Server CE 迁移到 Express - 现在我找不到物理数据库
如何将 bak 文件导入 SQL Server Express