如何在SQL Server Management Studio中以"真正的"CSV格式获得导出输出?

Pet*_*ore 66 sql-server csv ssms

我有一个查询,我在SQL Server Management Studio中运行(连接到SQL Server 2005数据库).我想以CSV格式导出数据.不想要CSV格式,你只需在每一列之间加一个逗号,但是"真正的"CSV格式,你可以在字符串中加上引号.这样,您可以导出包含逗号或引号的数据.

我看到的所有例子都局限于想要的格式.我无法弄清楚引用字符串的选项在哪里.

如果SSMS真的无法实现这一基本功能,那么还有其他工具可以轻松完成吗?每次我需要数据转储时,我都不想编写C#程序.

Mat*_*ton 115

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

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

它只是无视相信默认行为是CSV导出无法正确导入.我注意到Excel做了同样的事情,我将不得不去看看是否有一个选项.

与此同时,感谢我的同事在我咆哮关于CSV导出器完全无用的时候向我指出了这个奇怪的功能,这是我发现的关于它的最佳链接,所以我想我放了这里的知识是为了未来的搜索者的利益.

UPDATE

截图如下:在此输入图像描述

  • 对于遇到同样问题的其他任何人:您需要打开一个新的查询编辑器窗口,以使更改生效.在更改行为之前/之后对同一结果集执行"将结果保存为..."对导出的CSV没有任何影响. (40认同)
  • [**Note**](http://stackoverflow.com/questions/2259446/#comment19644839_11330194):SSMS将限定包含分隔符或限定符的字段,但不会限定包含换行符的字段.因此,在这方面,SSMS生成技术上无效的CSV文件 (18认同)
  • 微软:"让我们将CSV作为SSMS的默认导出格式".还有微软:"让我们忽略基本的实现细节." (6认同)
  • 也存在于SSMS 2008中. (4认同)
  • 在SSMS v17中,我发现指定的选项已丢失,但它似乎已与其他选项"复制或保存结果时包括列标题"合并,因为检查对我有所需的效果.仍需要打开新的查询窗口才能使设置生效. (3认同)
  • 我在 Excel 工作簿本身中添加“SQL 连接”获得了更好的结果。在那里粘贴您的查询,结果就会完美地拉入。我花了几个小时尝试从 SQL Management Studio 2014 获取 CSV,但即使打开此设置,保存结果功能似乎也完全损坏。 (2认同)

Joe*_*orn 11

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

SELECT '"' + REPLACE(CAST(column AS NVARCHAR(4000)), '"', '""') + '"' AS Header, ... FROM ...
Run Code Online (Sandbox Code Playgroud)

您可以将其构建为用户定义的函数,以使其更容易,但您必须为每种数据类型构建单独的函数.

  • 可能没有必要,但我发现更容易只是''''+ REPLACE(CAST(列AS VARCHAR),''','"''''+'''`.这样我就不用担心削弱了领域. (2认同)

use*_*815 8

令人遗憾的是,该选项在令人困惑的状态下可用,但并非完全可操作。以下至少是有效的。

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

你应该很高兴去!

  • 您会认为这会起作用,但是没有 - 数据中包含双引号的列没有正确转义。Faux-csv 是所有 SQL Server 处理的导出向导。 (5认同)

Mac*_*ver 7

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

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

打开新的查询窗口(新选项卡/会话)...如果不这样,下面的配置将丢失并重新设置为默认值

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

..如果新系统的逃逸顺序是"".

SELECT '"' + REPLACE(CAST(column1 AS VARCHAR(MAX)), '"', '""') + '"' FROM table1
Run Code Online (Sandbox Code Playgroud)

..如果新系统的逃逸顺序是\".

SELECT '"' + REPLACE(CAST(column1 AS VARCHAR(MAX)), '"', '\"') + '"' FROM table1
Run Code Online (Sandbox Code Playgroud)

组态:

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

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

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

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

选中查询选项>结果>文本>"在结果集中包括列标题"

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

查询选项>结果>文本>"每列中显示的最大字符数" - 设置为最大长度,以便不会截断字符串.

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

执行查询(F5)

提示报告的文件名

打开文件查看结果

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


bil*_*nkc 5

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


Gre*_*mer 0

我知道单独使用 SSMS 无法做到这一点。我知道TOAD有 CSV 选项。不确定它是否是转义格式。如果 SSIS 是一个选项,您可以转换为转义字符串的格式(真正的 CSV),但这不在 SSMS 中。

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