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

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

我所看到的所有例子都局限于崇拜者的forms。 我无法弄清楚引用string的选项在哪里。

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

谢谢!

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

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

它只是不相信,默认行为是CSV导出,不可能正确导入。 我注意到Excel也一样,我得去看看是否有一个选项。

同时,感谢我的同事,当我咆哮CSV导出器是完全无用的,这是我find的最好的链接,所以我想我会把这个奇怪的function指向我这里的知识是为了未来的search者的利益。

UPDATE

下面的截图: 在这里输入图像说明

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

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

您可以将其构build到用户定义的函数中,以使其更容易一些,但是您必须为每种数据types构build一个单独的函数。

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

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

打开新的查询窗口(新选项卡/会话)…如果你不这样做,下面的configuration丢失,并设置回默认值

编写查询以处理引号内的引号,并将所有string数据types包括在引号中。 另外请注意,不同的DBMS和编程语言语法为转义的双引号(如果将此输出用作另一个系统的input)接受不同的语法。 有些使用\" ,有些使用"" ,XML使用&quot ,可能是微软select忽略这个function的一个原因,所以他们不需要处理这些参数。

如果新系统的退出序列是""

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

如果新系统的退出序列是\"

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

组态:

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

查询选项>结果>“保存.csv结果时引用包含列表分隔符的string” – BROKEN; 不使用!

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

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

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

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

查询选项>结果>文本>“每列中显示的最大字符数” – 设置为最大长度,因此string不会被截断。

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

执行查询(F5)

提示报告的文件名

打开文件来查看结果

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

你如何看待从SSMS通过PowerShell导出到CSV ? 这篇文章描述了如何在SSMS中定义一个外部工具,它将当前select的查询发送到导出到CSV的PowerShell脚本。

我知道没有办法单独与SSMS做到这一点。 我知道TOAD(http://www.toadworld.com/)有一个CSV选项。; 不知道它是否是一个转义的格式。 如果SSIS是一个选项,则可以转换为转义string的格式(true CSV),但不在SSMS中。

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

通常我使用这种function:

 CREATE FUNCTION [dbo].[toExport] ( @txt varchar(max) ) RETURNS varchar(max) AS BEGIN return REPLACE(REPLACE(REPLACE(@txt, ';', ','), CHAR(10), ' '), CHAR(13), ' '); END 

在select我把它放在这里:

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

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

在MS Excel中pipe理数据是最简单的方法,而不会出现列问题。

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

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

可悲的是,这个选项是一个令人困惑的状态,但不可操作。 以下是至less工作。

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

你应该很好走!

由于上面提到的所有设置都没有修复CSV,所以我的SSMS(SQL Server 2014)生成和导出一个制表符分隔的文件并没有让它变得更好,一个同事和我做了一个转换器脚本(Ruby)来转换SSMS CSV转换为可读的CSV。 它保持原始文件的编码,分隔符和换行符,甚至在最后进行精确的字节匹配validation(它从parsing(!)input文件创buildSSMS格式的文件,并对两个文件进行比较)。

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

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