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

37
我花费了2天时间尝试从SQL服务器导出一个包含75000行的表格,其中包括一个大文本字段,包含用户输入数据。这些数据包含每个普通的ASCII字符、制表符和换行符。我需要导出CSV格式,其中每个字段都被引号引用,并且在引用列内的引号已经被适当地转义("")。 到目前为止,我尝试过以下方法: - 从管理工具中右键单击数据库并导出到Excel:由于字段太长而失败。 - 在管理工具中使用数据导出功能,将数据导出为带“text”分隔符和逗号分隔的平面文件 - 完全无用,无法转义字段内部的引号,使文件变得完全模糊不清。 - 通过命令行使用BCP - 同样不支持引用字段。 我需要使用FasterCSV ruby库进行导入。它不允许引号定界符是非标准ASCII字符或超过一个字符。它也不允许未被引用的列中包含\n或\r。 非常感谢任何帮助。

1
你能否直接从 Ruby 程序连接到 SQL Server,跳过导出/导入步骤?你可以使用 ruby-DBI 包连接并选择 *,然后按照你想要的方式进行引用。 - Doon
@Doon,这可能值得一试。如果我能够使用Ruby连接并获取结果,那么我就可以使用FasterCSV导出有效的CSV文件。由于我正在使用权限严格的机器上工作,不允许从外部客户端连接到SQL服务器,因此无法从外部客户端连接。 - Xac Stegner
如果您正在使用SQL Server 2012,可能会遇到此问题。https://connect.microsoft.com/SQLServer/feedback/details/735714 - andrej351
这个解决方案详细介绍了如何在SQL Server Management Studio中以真正的CSV格式获得导出输出:https://dev59.com/TG025IYBdhLWcg3wRDq8 - Entree
10个回答

阿里云服务器只需要99元/年,新老用户同享,点击查看详情
45

可以做到!不过你需要专门配置SSMS以使用引号输出,因为由于某种愚蠢的原因,这不是默认设置。

在你想要保存的查询窗口中,前往“查询(Query)” -> “查询选项(Query Options)…”

勾选“在保存 .csv 结果时,将包含列表分隔符的字符串加上引号”。

enabling quoted csv output

然后

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"

这正是我们想要的。

2022年8月8日更新

我刚刚安装了SSMS 18.12.1版本。 Microsoft不知何故从上述查询 -> 查询选项 -> 结果 -> 网格方法和Tim Partridge建议的工具 -> 选项 -> 查询结果 -> SQL Server -> 网格结果方法中都删除了“引用字符串”选项。我无法解决此SSMS版本的问题。


5
请注意,这个解决方案是针对特定查询的。您可以在“工具”>“选项”>“查询结果”>“SQL Server”>“网格结果”中为所有查询设置默认值,在保存.csv结果时要引用包含列表分隔符的字符串。 - Tim Partridge
10
对于包含换行符的文本字段,这种方法无效。 - jrothenbuhler
2
这乍一看起来不错,但它并不总是能转义双引号(")。此回答中的情况还好,但我尝试了 SELECT '"'SELECT 'a"' ,在这两种情况下,使用 SQL Server Management Studio 2014 输出的值都是逐字输出的。这绝对是一个有用的答案,但我已经给它投了反对票,因为它只在某些情况下有效,可能会给那些依赖它的人造成麻烦。 - Sam
@jrothenbuhler - 新行的问题很麻烦,所以我写了一个程序来进行导出。https://github.com/deeja/SQLtoCSV/releases - Dan
1
请注意,使用SSMS 17,此选项已被删除。 - Jimmy M.
显示剩余2条评论

26

我也一直在试图解决这个问题。不确定这对你是否有效,因为你的表比我的大得多,但这是我凭直觉做的:

  1. 通过执行 SELECT * 语句在 Express 中打开我的表
  2. 只需选择结果行并按下 Ctrl + C
  3. 打开 Excel
  4. 突出显示我要粘贴的表格列数
  5. 粘贴,然后它竟然成功了!
  6. 现在只需要将 Excel 导出为 CSV 文件就完成了。

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


5
这个答案真的应该被点赞。我比提问者更震惊的是这实际上起作用了。我在一个有1.7万行数据表的远程桌面上执行了它,因为生产服务器上没有安装Excel或其他任何软件。所以我进入了客户RDP系统,运行了SQL,复制了行,然后回到正在运行RDP会话的主机系统,并将其粘贴到OpenOffice中。流传剪贴板数据花了大约10分钟时间通过RDP,之后我不得不拖动OpenOffice一下才能重新绘制窗口,但它确实运行并生成了转义的数据。悲伤但却是事实。 - Kristopher Ives
16
我希望补充一句话,就是我希望微软的工程师每天都会被踢到脸上。 - Kristopher Ives
3
很遗憾这个答案没有被标记,因为它绝对有效。在我的情况下,从 SSMS 导出时字符串换行符没有被正确转义。复制/粘贴到 Excel 中,然后再导出是正确的做法,因为它更好地处理 CSV 文件。 - Frank Hale
2
这是完美的解决方案,这样所有垃圾字符的问题都消失了,不知道为什么使用 SQL Server 导出会导致特殊字符的错误解读。谢谢 ckpepper02。 - linuxatico
1
最简单的东西往往是最难的解决方案。干得好! - medina
显示剩余5条评论

11

最简单的方法:

使用Excel数据导入工具

  • 进入“数据” > “从其他来源” > “从SQL Server”
  • 填写服务器名称等信息。
  • 选择要导入的表格或视图。

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


这是原问题的一个解决方案。它在本地对我起作用,但由于安全限制,我无法通过Excel连接到我的数据库。 :-( - Ads
3
我有一大堆带引号、换行符和奇怪字符的数据。下面是可行的解决方案。谢谢。(但需要注意的是,我必须将我的列选择到一个新表中,这样Excel才能看到表格而不是结果集。) - Kevin Quiring
是的,创建一个视图并导出它,而不是运行一些 SQL 并制作一个临时报告。我认为这是最佳实践。 - Dave

2
我找到的最简单的解决方案是在查询中添加双引号;
SELECT '"'+MYCHARACTERDATA+'"' FROM MYTABLE
如果您的电子表格允许使用自定义文本限定符,则可以使用更奇特的字符(如|)来避免在文本中使用双引号。

愚蠢的是,SSMS应该将其导出为带引号的文本字段和这些字段中正确转义的引号的正确CSV格式。


2
以下是我用来完成这个任务的脚本的核心部分:
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")
希望能帮到您!

1
我很好奇为什么没有人建议使用SSIS(SQL Server Integration Services)进行此过程?所有在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 时,它感觉需要付出很多努力。这不应该这么难! - aucuparia

0

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

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

然后选择SQL Server作为源,Flat File作为目标。将文件命名为MyFile.csv。

将文本限定符设置为"

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

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


糟糕..!!!! 快成功了.. 预览过程完美无缺,但在实际导出时出现了错误: 错误0xc020802e: 数据流任务1: "Destination - testttttt_csv.Inputs[Flat File Destination Input].Columns[Main_Content]" 的数据类型为DT_NTEXT,这不支持ANSI文件。请改用DT_TEXT并使用数据转换组件将数据转换为DT_NTEXT。(SQL Server导入和导出向导) - Ads

0
我能想到的最好的解决方案是选择所有行并将其复制为XML格式。 然后将其粘贴到记事本文件中并保存为XML文件。 然后从Excel中打开该XML文件,就完成了!至少这就是我得到文件的方法。

0

3
很遗憾这没有帮到你。所有自带于 SQL Server Express 的工具都会创建无效的 CSV 文件。 - Xac Stegner

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,