我有一个在SQL Server Management Studio中运行的查询(连接到SQL Server 2005数据库)。我想以CSV格式导出数据。不是那种伪装成CSV格式,只需在每个列之间放置逗号,而是“真正”的CSV格式,其中在字符串周围放置引号。这样您就可以导出具有逗号或引号的数据。
我看到的所有示例都限制了自己的伪CSV格式。我无法弄清楚如何选项来引用字符串。
如果SSMS真的无法完成这个基本的功能,还有其他工具可以轻松完成吗?我不想每次需要数据转储时都编写C#程序。
我有一个在SQL Server Management Studio中运行的查询(连接到SQL Server 2005数据库)。我想以CSV格式导出数据。不是那种伪装成CSV格式,只需在每个列之间放置逗号,而是“真正”的CSV格式,其中在字符串周围放置引号。这样您就可以导出具有逗号或引号的数据。
我看到的所有示例都限制了自己的伪CSV格式。我无法弄清楚如何选项来引用字符串。
如果SSMS真的无法完成这个基本的功能,还有其他工具可以轻松完成吗?我不想每次需要数据转储时都编写C#程序。
我的常规解决方法是将它构建到查询中:
SELECT '"' + REPLACE(CAST(column AS NVARCHAR(4000)), '"', '""') + '"' AS Header, ... FROM ...
你可以将它构建为一个用户自定义函数,这样会更加方便,但是你需要为每个数据类型构建一个单独的函数。'"' + REPLACE(CAST(column AS VARCHAR), '"', '""') + '"'
更容易。这样我就不用担心削弱字段了。 - RobNVARCHAR
,则需要保留NVARCHAR
类型。 - N. M.REPLACE(REPLACE(tbl.Notes, CHAR(10),''), CHAR(13),'') as Notes
的翻译为中文是:将tbl.Notes中的换行符(CHAR(10))和回车符(CHAR(13))替换为空字符串,并将结果命名为Notes
。 - Ben McIntyre你应该可以开始了!
quotename
将它们包装起来。幸运的是,我没有遇到双引号。我建议使用本地选项,而不是依赖外部解决方案。 - r.sumeshSELECT '"' + REPLACE(CAST(column1 AS VARCHAR(MAX)), '"', '""') + '"' FROM table1
如果新系统的转义序列为\"
。
SELECT '"' + REPLACE(CAST(column1 AS VARCHAR(MAX)), '"', '\"') + '"' FROM table1
配置:
查询选项 > 结果 > "将列标题包含在复制或保存结果中" 已勾选
查询选项 > 结果 > "保存 .csv 结果时引用包含列表分隔符的字符串" - 已损坏;不要使用!
查询选项 > 结果 > 其他未勾选
查询选项 > 结果 > 文本 > 逗号分隔(右上角设置)
查询选项 > 结果 > 文本 > "将列标题包含在结果集中" 已勾选
查询选项 > 结果 > 文本 > 其他未勾选
查询选项 > 结果 > 文本 > "每个列中显示的最大字符数" - 设置为最大长度,以避免字符串被截断。
查询 > 将结果保存到文件(这是所有3个选项之间的切换)
执行查询(F5)
提示报告文件名
打开文件查看结果
注意:如果您需要定期执行此操作,则最好在 .NET 或 Java 中开发可以为您执行此操作的程序,或者任何您熟悉的语言。否则,您很可能会犯错误。然后,请在定义 SQL Server 导出之前,非常注意导入系统的语法。
你对通过PowerShell从SSMS导出CSV文件有何感想?本文介绍如何在SSMS中定义一个外部工具,将当前选定的查询发送到一个PowerShell脚本,该脚本将其导出为CSV文件。
在阅读答案(尤其是iacob的答案)并尝试在较新版本的SSMS中使用建议的选项之后,我决定深入研究并编写一份综合概述,介绍这些选项以及它们如何影响导出格式。
(这是使用SSMS v18.4的情况)
选择这两个选项似乎可以产生最方便使用的CSV格式,即使它使用分号而不是逗号作为分隔符。
另一个问题是将NULL值导出为“NULL”而不是空字段。
无论选择哪种方法(导出数据任务/将结果导出到CSV)以及选择哪些选项,似乎仍然没有单一的方法能够使SSMS正确地导出具有逗号、分号、双引号以及NULL值支持的CSV文件。
我认为这里的人们已经提供了正确的解决方案,特别是Matthew Walton的回答关于更改选项,但对于我来说这不可用(可能是因为我的数据库是旧版本)
或者,如果您能够将其导出为管道或逗号分隔符,并且您只想在列周围添加引号,则只需在Powershell中运行此命令。
Import-Csv 'C:\input.txt' -Delimiter '|' |
Export-Csv 'C:\output.csv' -Delimiter '|' -NoType
input.txt文件
1|A|Test|ABC,PQR
"1"|"A"|"Test"|"ABC,PQR"
:
CREATE FUNCTION [dbo].[toExport]
(
@txt varchar(max)
)
RETURNS varchar(max)
AS
BEGIN
return REPLACE(REPLACE(REPLACE(@txt, ';', ','), CHAR(10), ' '), CHAR(13), ' ');
END
而在
相反,您可以选择将其导出为制表符分隔格式。