如何在SQL Server Management Studio中以“真实” CSV格式获取导出输出?


79

我有一个查询,我正在SQL Server Management Studio中运行(连接到SQL Server 2005数据库)。我想以CSV格式导出数据。不想使用CSV格式(在每个列之间只加逗号),而不想使用“真实” CSV格式,在其中用引号引起来。这样,您可以导出其中包含逗号或引号的数据。

我看到的所有示例都将自己限制为wannabe格式。我不知道引用字符串的选项在哪里。

如果SSMS确实不具备此基本功能,那么是否还有其他工具可以轻松做到这一点?我不想每次需要数据转储时都必须编写C#程序。


1
因为这让我很烦,所以我编写了一个使用适当的CSV编写器的程序:github.com/deeja/SQLtoCSV/releases
Dan

3
到底

Answers:


124

在SSMS 2012中,有一个选项,在“工具”->“选项”->“查询结果”->“ SQL Server”->“结果到网格”中,它称为“保存.csv结果时引用包含列表分隔符的字符串”。我不知道这种选择存在了多久,但我对两件事感到困惑:

  1. 默认情况下怎么不打开
  2. 为什么这是一个选项,而不是CSV导出代码的固有部分

它只是无视默认行为是无法正确导入CSV导出的信念。我已经注意到Excel的作用相同,我必须去看看它是否也有一个选项。

同时,感谢我的同事在我对CSV导出程序完全没有用的时候向我指出了这一奇异的功能,这是我找到的最好的链接,所以我以为这里的知识为将来的搜索者造福。

更新

下面的屏幕截图:在此处输入图片说明


4
同样存在于SSMS 2008中。
劳埃德

21
注意:SSMS将限定包含定界符或限定符的字段,但不会限定包含换行符的字段。因此,就此而言,SSMS会生成技术上无效的CSV文件
KyleMit 2014年

41
对于其他遇到相同问题的人:您需要打开一个新的查询编辑器窗口以使更改生效。这样做Save Results As..在同一个结果集前/变更后的行为,以使导出的CSV没有区别。
杰森·拉克

7
在SSMS v17中,我发现缺少指定的选项,但是它似乎已经与其他选项“在复制或保存结果时包括列标题”合并了,因为检查对我而言具有预期的效果。要使设置生效,仍然需要打开新的查询窗口。
九尾

9
微软:“让CSV成为SSMS的默认导出格式”。也是微软:“让我们忽略基本的实现细节。”
Owen

12

我通常的解决方法是将其构建到查询中:

SELECT '"' + REPLACE(CAST(column AS NVARCHAR(4000)), '"', '""') + '"' AS Header, ... FROM ...

您可以将其内置到用户定义的函数中,以使其变得更容易一些,但必须为每种数据类型构建一个单独的函数。


2
可能不是必需的,但我发现它更容易实现'"' + REPLACE(CAST(column AS VARCHAR), '"', '""') + '"'。这样,我就不必担心削弱字段。
罗布

1
今天,我使用varchar(max)。当我最初写这篇文章时,我刚从一家仅使用(ugh)Sql Server 2000的商店来,并且只是开始看看2005
。– Joel Coehoorn

您可能还需要保留列类型,例如,NVARCHAR如果原始类型为NVARCHAR
NM 2012年

好点子。varchar => nvarchar正在扩展,不会破坏内容,但是nvarchar => varchar可能会丢失数据。在最好做的事情是随便用原来的列相匹配,但由于人们往往只是复制/粘贴示例代码关闭堆栈溢出的,在我的答案代码可能是更好的使用为nvarchar(这种变化是现在)。
Joel Coehoorn '18

由于Microsoft无法完成导出到csv文件的基本操作,因此这是最好的解决方案。使用投票最多的解决方案无法正确导出带换行符的文件。

8

这些设置的不同组合可能导致输出结果不正确或部分数据。这是因为Microsoft认为解决这些问题不够重要。我只是在将结果发送到文件时解释CSV文件会发生什么情况。

为了获得良好的结果,请执行以下操作:

打开新的查询窗口(新标签页/会话)...如果不这样做,则下面的配置将丢失并恢复为默认值

编写查询以处理引号内的引号,并将所有字符串数据类型都包装在引号中。还应注意,不同的DBMS和编程语言语法对于转义的双引号接受不同的语法(如果将此输出用作另一个系统的输入)。一些用\"。一些用""。XML使用"。可能是Microsoft选择忽略此功能的原因,因此他们不必处理这些参数。

..如果新系统的转义序列为""

SELECT '"' + REPLACE(CAST(column1 AS VARCHAR(MAX)), '"', '""') + '"' FROM table1

..如果新系统的转义序列为\"

SELECT '"' + REPLACE(CAST(column1 AS VARCHAR(MAX)), '"', '\"') + '"' FROM table1

组态:

查询选项>结果>“复制或保存结果时包括列标题”已选中

查询选项>结果>“保存.csv结果时引用包含列表分隔符的字符串”-损坏;不使用!

查询选项>结果>其他未选中

查询选项>结果>文本>以逗号分隔(在右上角设置)

查询选项>结果>文本>“在结果集中包含列标题”已选中

查询选项>结果>文本>其他未选中

查询选项>结果>文本>“每列中显示的最大字符数”-设置为最大长度,这样字符串就不会被截断。

查询>结果到文件(这是所有3个选项之间的切换)

执行查询(F5)

提示输入报告的文件名

打开文件查看结果

注意:如果需要定期执行此操作,最好只开发一个程序以.NET或Java或任何您喜欢的语言为您执行此操作。否则,您极有可能犯错。然后,在定义从SQL Server导出之前,要非常了解要导入的系统的语法。


7

令人遗憾的是,该选项处于混乱状态,但无法完美运行。以下至少是有效的。

  1. 从数据库上下文菜单中选择“任务>导出数据”(在表级别上也不起作用)
  2. 对于源,选择“用于SQL Server的Microsoft OLE DB提供程序”
  3. 对于目标,选择“平面文件...”,然后将“格式”指定为定界和 text qualifier双引号
  4. 选择表或查询(我使用查询)
  5. 完成向导

你应该很好走!


5
您会认为这会起作用,但是不会-数据中包含双引号的列无法正确转义。Faux-csv是导出向导上所有要处理的SQL Server。
mattmc3

我或我的消费者没有理由抱怨文本字段中数据中包含逗号和单引号的地方。如前所述,我使用的是查询选项,如果您知道脏字段,可以随时使用来包装它们quotename。幸运的是,虽然没有用双引号引起来。我建议使用本机选项,而不要依赖外部解决方案。
user1017815

即使它不会自动转义双引号,该选项仍然是最实用的。用replace()转义双引号很容易。
Brett Donald

4

您对通过PowerShell从SSMS导出到CSV的感觉如何?这篇文章描述了如何在SSMS中定义一个外部工具,该工具将当前选择的查询发送到PowerShell脚本,该脚本导出为CSV。


到目前为止,这看起来似乎是我的最佳选择。我什至还没有将其添加到SSMS的“外部工具”菜单中-我只是从命令行运行它。
Peter Recore 2011年

1

我不知道仅凭SSMS就能做到这一点。我知道TOAD(http://www.toadworld.com/)具有CSV选项。不确定是否为转义格式。如果选择了SSIS,则可以转换为转义字符串的格式(true CSV),但SSMS中不支持这种格式。

如果必须编写C#程序,我将考虑查询表,然后运行查询,因为元数据会提示需要进行转义的线索。


1

通常我使用这种功能:

CREATE FUNCTION [dbo].[toExport]
(
    @txt varchar(max)

)
RETURNS varchar(max)
AS
BEGIN

    return REPLACE(REPLACE(REPLACE(@txt, ';', ','), CHAR(10), ' '), CHAR(13), ' ');

END

在选择中,我把它放在这里:

SELECT dbo.toExport( column_name ) AS column_name FROM ....

在SMSS 2012中,只需右键单击网格并将结果另存为,或将所有网格(ctrl-A)和ctrl-V复制到Excel。

这是在例如MS Excel中管理数据而没有列问题的最简单方法。

当然,您必须在工具->选项->查询结果-> Sql Server->结果到网格中单击“保存.csv结果时引用包含列表分隔符的字符串”,并在需要时增加“检索的最大字符数”。


1

也许这不适用于您的应用程序,但是我通常通过导出为制表符分隔的格式来解决此问题。如果适用于您,请不要忽略此简单的解决方案。


1

由于上述所有设置都无法修复CSV,因此我的SSMS(SQL Server 2014)生成了,并且导出制表符分隔的文件并没有使它变得更好,所以我和一位同事制作了转换器脚本(Ruby)来转换SSMS CSV转换为可读的CSV。它保留原始文件的编码,分隔符和换行符,甚至在末尾进行精确的字节匹配验证(它从解析的(!)输入文件创建SSMS格式的文件,并比较两个文件)。

https://gist.github.com/gr8bit/62202ea89a7e3aff67df2ff080ee8e88

如果您遇到错误,请在github上与我联系。干杯!


我需要对此进行测试,但这似乎正是我们所需要的,并且它已经在Ruby中。大!
Ladislav Gallay

0

我认为最简单的方法是打开excel并从SQL连接导入数据,而不是使用SSMS导出...。我使用的是SSMS 2016,它没有选项“在保存.csv结果时引用包含列表分隔符的字符串”大概是因为它不起作用

罗恩


0

从2016年开始,这是在查询选项中选择以下选项时的默认行为:

在此处输入图片说明

列由逗号分隔,并且包含逗号的字段用双引号引起来。


0

我想提出一种替代方法。我把这个问题加为书签。投票了很多答案和评论。但是,当我需要执行从SQL Management Studio中的查询导出CSV文件的普通任务时,总是很麻烦。

最简单的解决方案是只使用另一个工具,免费的Dbeaver

  1. 下载Dbeaver多平台数据库工具(有便携式版本,如果您的计算机没有管理员权限,则可以使用)。
  2. 运行它并创建一个新的SQL Server连接。
  3. 打开一个新的“ Sql编辑器”选项卡
  4. 单击箭头执行您的查询
  5. 右键单击结果网格,然后选择“导出数据”,然后选择CSV
  6. 瞧!现在,您有了一个格式正确的CSV文件。

没有神秘感。无需重启。它只是工作。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.