繁体   English   中英

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

[英]How to get export output in "real" CSV format in SQL Server Management Studio?

我有一个查询,我正在 SQL Server Management Studio 中运行(连接到 SQL Server 2005 数据库)。 我想以 CSV 格式导出数据。 不是想要的 CSV 格式,您只需在每列之间添加一个逗号,而是“真正的” CSV 格式,您可以在字符串周围加上引号。 通过这种方式,您可以导出包含逗号或引号的数据。

我看到的所有示例都仅限于崇拜者格式。 我不知道引用字符串的选项在哪里。

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

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

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

它只是违背了默认行为是让 CSV 导出无法正确导入的信念。 我注意到 Excel 也这样做,我必须 go 看看是否也有一个选项。

同时,感谢我的同事在我抱怨 CSV 导出器完全没用时向我指出了这个奇怪的功能,这是我找到的关于它的最佳链接,所以我想我应该把这里的知识是为了未来的搜索者的利益。

更新

下面的截图: 在此处输入图像描述

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

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

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

这些设置的不同组合可能会导致 output 中的结果不正确或数据不完整。 这是因为微软认为解决这些问题不够重要。 我只是解释在将结果发送到文件时 CSV 文件会发生什么。

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

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

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

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

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

.. 如果新系统的 Escape Sequence 是\" .

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

配置:

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

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

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

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

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

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

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

Query > Results To File(这是所有 3 个选项之间的切换)

执行查询 (F5)

提示输入报告的文件名

打开文件查看结果

注意:如果您需要定期执行此操作,您最好只开发一个程序,在 .NET 或 Java 或任何您熟悉的语言中为您执行此操作。 否则你犯错误的可能性很大。 然后在定义从 SQL 服务器导出之前,请务必注意要导入的系统的语法。

令人遗憾的是,该选项在令人困惑的 state 中可用,但不能完美运行。 以下至少是有效的。

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

你应该好好去!

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

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

在此处输入图像描述

列用逗号分隔,包含逗号的字段用双引号封装。

通常我使用这种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,不会出现列问题。

当然,您必须在Tools -> Options -> Query Results -> Sql Server -> Results to Grid中单击“保存时引用包含列表分隔符的字符串。csv 结果”,如果需要,可以增加Maximum Characters Retrieved数。

您可以改为导出为制表符分隔的格式。

As all the settings mentioned above didn't fix the CSV my SSMS (SQL Server 2014) generated (nor exporting a tab-separated file), a colleague and I made aconverter script (Ruby) to convert the SSMS CSV into readable CSV.

它保留原始文件的编码、分隔符和换行符,甚至在最后进行精确字节匹配验证(它从解析的 (.) 输入文件创建一个 SSMS 格式的文件并比较两个文件)。

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

罗恩

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

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

我想提出一种替代方法。 我在 SO 中有这个问题的书签。 在很多答案和评论中投票。 但是,当我需要执行从 SQL Management Studio 中的查询导出 CSV 文件的平庸任务时,总是一团糟。

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

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

没有奥秘。 无需重新启动。 它只是工作。

SSMS 工具 >> 选项 >> 查询结果 >> SQL 服务器 >> 结果到网格,设置:“保存时引用包含列表分隔符的字符串。csv 结果”。

在此处输入图像描述

此外,如果逗号不是默认分隔符(北欧国家等),控制面板 >> 时钟、语言和区域 >> 区域 >> 其他设置在此处输入图像描述也很重要

这也引用了包含换行符的单元格

作为旁注,当将这样创建的文件导入 Excel 时,有一些事情需要注意。 CSV文件必须通过双击打开(来源: https://superuser.com/questions/180964/how-to-open-semicolon-delimited-csv-files-in-us-version-of-excel ) ,如果Excel区域设置使用; 作为分隔符,必须在 CSV 文件的第一行添加以下内容:

九月=,

在阅读了答案(尤其是 iacob 的答案)并在新版本的 SSMS 中尝试了建议的选项后,我决定深入研究并编译选项的全面概述以及它们如何影响导出格式。

将查询结果导出到文件选项

(这是 SSMS v18.4)

  • 未选择任何选项:
    => 数据导出为“CSV”,但使用分号而不是逗号作为分隔符。
    => 包含分号和/或双引号的值正确地用双引号括起来。
    => 双引号用 2x 双引号正确转义。
  • “复制或保存结果时包括列标题”
    => 就像它所说的那样,只是将列标题添加为第一行。
    => 与 iacob 的回答相反,此选项不会将分隔符更改为逗号,并且不需要用双引号和正确的 escaping 双引号将值括起来。
  • “在复制或保存时保留 CR/LF”
    => 包含换行符的值正确地用双引号括起来,并保留换行符。

选择这两个选项似乎会产生最有用的 CSV 格式,即使它使用分号而不是逗号作为分隔符。

另一个问题是 NULL 值导出为“NULL”而不是空字段。

结论:

无论选择哪种方法(导出数据任务/导出结果到 CSV)以及选择哪些选项,似乎仍然没有单一的方法可以使 SSMS 正确导出到 CSV 并正确支持逗号、分号、双引号以及null 值。

我能够使用 Matthew Walton 的回答导出我的一个结果集,但是我的另一个结果集无法正常工作。 我正在使用 sql 数据中的 xml 数据,因此我不能使用逗号分隔或制表符分隔的输出。

我通过使用利用 pandas 的基本 python 脚本解决了这个问题。 Pandas 具有 dataframe 对象,可以干净地存储您的所有数据,然后您可以将 dataframe 导出到 ZDBF507C902FE4D2BB8607C906FA7D2BB8 工作表中。 我用这个链接来帮助我 - https://appdividend.com/2020/04/27/python-pandas-how-to-convert-sql-to-dataframe/

import pandas as pd
import pyodbc
conn = pyodbc.connect(connection_string)
cursor = conn.cursor()
sql_query = pd.read_sql_query(
    '''SELECT TOP (1000) [column_1]
                  ,[column_2]
                  ,[column_3]
                   FROM [My_Table]
                  ''', conn)

df = pd.DataFrame(sql_query, columns=['column_1', 'column_2', 'column_3'])
df.to_excel("exported_data.xlsx", index=False)

我认为人们在这里提供了正确的解决方案,特别是 Matthew Walton 关于更改选项的回应,但对我来说这是不可用的(可能是因为我的数据库是旧版本)

或者,如果您能够将其导出为 pipe 或逗号分隔,并且您想要的只是在列周围添加引号,那么只需在 Powershell 中运行此命令。

Import-Csv 'C:\input.txt' -Delimiter '|' |
    Export-Csv 'C:\output.csv' -Delimiter '|' -NoType

输入.txt 文件

1|A|Test|ABC,PQR

命令执行后

"1"|"A"|"Test"|"ABC,PQR"

这里有很多很棒的解释。 但对我来说,只需使用 SQL 导出数据任务向导,将目标作为平面文件,我只需将文本限定符设置为“。这对我有用。其他所有设置都是默认设置。

这帮助我指出了正确的方向:

https://social.msdn.microsoft.com/Forums/sqlserver/en-US/43f39e86-67c1-4ba1-a3ee-cd2e3688936f/how-to-deal-with-commas-in-data-when-exporting-to- a-csv-file?forum=sqlintegrationservices

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM