我有一个查询,我正在SQL Server Management Studio中运行(连接到SQL Server 2005数据库)。我想以CSV格式导出数据。不想使用CSV格式(在每个列之间只加逗号),而不想使用“真实” CSV格式,在其中用引号引起来。这样,您可以导出其中包含逗号或引号的数据。
我看到的所有示例都将自己限制为wannabe格式。我不知道引用字符串的选项在哪里。
如果SSMS确实不具备此基本功能,那么是否还有其他工具可以轻松做到这一点?我不想每次需要数据转储时都必须编写C#程序。
我有一个查询,我正在SQL Server Management Studio中运行(连接到SQL Server 2005数据库)。我想以CSV格式导出数据。不想使用CSV格式(在每个列之间只加逗号),而不想使用“真实” CSV格式,在其中用引号引起来。这样,您可以导出其中包含逗号或引号的数据。
我看到的所有示例都将自己限制为wannabe格式。我不知道引用字符串的选项在哪里。
如果SSMS确实不具备此基本功能,那么是否还有其他工具可以轻松做到这一点?我不想每次需要数据转储时都必须编写C#程序。
Answers:
Save Results As..在同一个结果集前/变更后的行为,以使导出的CSV没有区别。
我通常的解决方法是将其构建到查询中:
SELECT '"' + REPLACE(CAST(column AS NVARCHAR(4000)), '"', '""') + '"' AS Header, ... FROM ...
您可以将其内置到用户定义的函数中,以使其变得更容易一些,但必须为每种数据类型构建一个单独的函数。
'"' + REPLACE(CAST(column AS VARCHAR), '"', '""') + '"'。这样,我就不必担心削弱字段。
NVARCHAR如果原始类型为NVARCHAR。
这些设置的不同组合可能导致输出结果不正确或部分数据。这是因为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导出之前,要非常了解要导入的系统的语法。
令人遗憾的是,该选项处于混乱状态,但无法完美运行。以下至少是有效的。
text qualifier双引号你应该很好走!
quotename。幸运的是,虽然没有用双引号引起来。我建议使用本机选项,而不要依赖外部解决方案。
您对通过PowerShell从SSMS导出到CSV的感觉如何?这篇文章描述了如何在SSMS中定义一个外部工具,该工具将当前选择的查询发送到PowerShell脚本,该脚本导出为CSV。
通常我使用这种功能:
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结果时引用包含列表分隔符的字符串”,并在需要时增加“检索的最大字符数”。
由于上述所有设置都无法修复CSV,因此我的SSMS(SQL Server 2014)生成了,并且导出制表符分隔的文件并没有使它变得更好,所以我和一位同事制作了转换器脚本(Ruby)来转换SSMS CSV转换为可读的CSV。它保留原始文件的编码,分隔符和换行符,甚至在末尾进行精确的字节匹配验证(它从解析的(!)输入文件创建SSMS格式的文件,并比较两个文件)。
https://gist.github.com/gr8bit/62202ea89a7e3aff67df2ff080ee8e88
如果您遇到错误,请在github上与我联系。干杯!