在SQL Server 2008中如何将查询结果导出为.csv文件?

174

如何在SQL Server 2008中将查询结果导出为.csv文件?


可能是重复的问题:如何使用sqlcmd从SQL Server导出数据为CSV格式? - Martin Smith
你需要转义分隔符吗?到目前为止,大多数答案都假定你不需要,这并不是真正的 CSV。 - Nick
@Nick - 通常分隔符只包含在字符串中,而且它们通常被引号括起来。请参阅我的答案以查看解决方案。https://dev59.com/TG025IYBdhLWcg3wRDq8#32660037 - Entree
我有时会使用Python。 - Eduards
15个回答

199
  1. 打开 SQL Server Management Studio
  2. 选择 "工具" > "选项" > "查询结果" > "SQL Server" > "输出到文本"
  3. 在最右边有一个下拉框叫做“输出格式”
  4. 选择“逗号分隔”并点击“确定”

以下是该图像的全屏版本

enter image description here

这将以逗号分隔的文本形式显示您的查询结果。

如果要将查询结果保存到文件中:按下 Ctrl + Shift + F。


11
答案有点误导性......当你按下 Ctrl+Shift+F 时,它只会更改输出模式,不会影响查询结果,如果你已经运行了查询。要使其生效,需要重新运行查询。当你在“将结果保存到文件”模式下运行查询时,它应该提示你想要保存结果的位置。 - qJake
3
请前往“工具” > “选项” > “查询结果” > “SQL Server” > “文本结果” - congusbongus
57
重新运行查询并不足够,我必须关闭当前的查询窗口,打开一个新窗口,然后再次运行查询。 - Breandán
3
确认@Breandán的评论。新设置不会应用于当前打开的查询窗口,必须关闭它们并重新运行查询。 - Shinigamae
5
我需要做的一件事是将它导出为默认的RPT扩展名。完成后,您只需将其重命名为CSV即可使用。 - Thomas Bennett
显示剩余8条评论

173

我知道这有点老了,但这里有一种更简单的方法...

  1. 使用默认设置运行查询(结果以网格格式显示,如果结果不在网格格式中,请参见下面)

  2. 右键单击网格结果,然后单击“另存为”并保存。

如果您的结果不在网格格式中,请右键单击写查询的位置,悬停在“Results To”上,然后单击“Results To Grid”

请注意,您不会捕获列标题!

祝你好运!


1
唯一的问题是这种方法似乎不允许您设置任何选项。例如,所有的NULL在输出文件中都显示为“NULL”等。也许有一种我不知道的设置方法。 - Noah
18
令人惊讶的是,即使在 SSMS 2012 中,它也没有正确地为 CSV 引用文本。 在 CHAR / VARCHAR 中出现的逗号或换行符应该加上引号,但实际上并没有这样做。 这会导致数据移到新列或新行中。 - Eric J.
5
也不会提供列标题。 - Don
11
如果您进入"查询"->"查询选项...",然后在网格选项卡中勾选"在复制或保存结果时包括列标题",则可以获得列标题。 - Rob Wise
9
这应该就是答案。 - pspahn
显示剩余4条评论

54
您可以使用PowerShell。
$AttachmentPath = "CV File location"
$QueryFmt= "Query"

Invoke-Sqlcmd -ServerInstance Server -Database DBName -Query $QueryFmt | Export-CSV $AttachmentPath

谢谢!这是唯一一个对我有用的建议。正确处理转义字符。 - emertechie
3
如果我可以的话,我会给你加上+10分。只有正确处理转义字符的答案才能得到分数。为了使脚本运行,我必须在脚本顶部添加两行代码:Add-PSSnapin SqlServerCmdletSnapin100Add-PSSnapin SqlServerProviderSnapin100 - Eric J.
1
如果遇到超时问题,请添加 querytimeout,例如 Invoke-Sqlcmd -ServerInstance MySQLserver123 -Query $QueryFmt -querytimeout 600 | Export-CSV $AttachmentPath - Tilo
1
作为 Powershell 初学者,我需要安装 SqlServer 模块:Install-Module -Name SqlServer(但不需要插入那些 Cmdlets)。此外,我将命令保存在脚本中,但在运行之前需要更改执行策略:Set-ExecutionPolicy -ExecutionPolicy Unrestricted -Scope CurrentUser - sandyscott
1
@sandyscott 我也是 Powershell 的新手,所以谢谢你。无论如何,在这种情况下,RemoteSigned 执行策略就足够了。 - BigBother
2
SSMS在将结果保存为文本时有一个字符限制,仅为8192个字符。使用PowerShell可以规避此限制!感谢这个答案。 - klabarge

16
如果涉及的数据库是本地的,以下可能是将查询结果导出到CSV文件(即,给您最多的控制)的最强大方法。
  1. 复制查询。
  2. 在对象资源管理器中右键单击相关的数据库。
  3. 选择“任务”>>“导出数据…”
  4. 配置您的数据源,然后单击“下一步”。
  5. 选择“扁平文件”或“Microsoft Excel”作为目标。
  6. 指定文件路径。
  7. 如果使用扁平文件,请根据需要进行配置。如果使用 Microsoft Excel,请选择“Excel 2007”(早期版本的行限制为64k)
  8. 选择“编写查询以指定要传输的数据”
  9. 粘贴第1步的查询。
  10. 单击下一步>>查看映射>>单击下一步>>选择“立即运行”>>单击“完成”两次。

经过详尽的研究后,我发现以下是最佳选项

PowerShell脚本

$dbname = "**YOUR_DB_NAME_WITHOUT_STARS**"
$AttachmentPath = "c:\\export.csv"
$QueryFmt= @"
**YOUR_QUERY_WITHOUT_STARS**
"@

Invoke-Sqlcmd   -ServerInstance **SERVER_NAME_WITHOUT_STARS** -Database  $dbname -Query $QueryFmt | Export-CSV $AttachmentPath -NoTypeInformation

以管理员身份运行 PowerShell

& "c:\path_to_your_ps1_file.ps1"

1
如果你面对超时问题,添加 querytimeout,示例:Invoke-Sqlcmd -ServerInstance MySQLserver123 -Query $QueryFmt -querytimeout 600 | Export-CSV $AttachmentPath - Tilo
你的第一个解决方案非常完美。它也很好地处理了回车符号的问题。 - ABH

8

使用 T-SQL

INSERT INTO OPENROWSET('Microsoft.ACE.OLEDB.12.0','Text;Database=D:\;HDR=YES;FMT=Delimited','SELECT * FROM [FileName.csv]')
SELECT Field1, Field2, Field3 FROM DatabaseName

但是,还有一些注意事项:

  1. 你需要安装Microsoft.ACE.OLEDB.12.0提供程序。Jet 4.0提供程序也可以使用,但它已经过时了,所以我使用了这个。

  2. CSV文件必须已经存在。如果你使用标题(HDR=YES),请确保CSV文件的第一行是所有字段的分隔列表。


6

在N.S的回答基础上,我有一个PowerShell脚本可以导出至一个CSV文件,该文件中字段周围有引号并且以逗号分隔,同时跳过文件中的标题信息。

add-pssnapin sqlserverprovidersnapin100
add-pssnapin sqlservercmdletsnapin100

$qry = @"
Select
  *
From
 tablename
"@

Invoke-Sqlcmd -ServerInstance Server -Database DBName -Query $qry | convertto-CSV -notype | select -skip 1  > "full path and filename.csv"

前两行代码使您能够使用Invoke-SqlCmd命令。


6

微软Excel -> 数据 -> 新查询 -> 从数据库 ..按照步骤进行操作


3
INSERT INTO OPENROWSET('Microsoft.ACE.OLEDB.12.0','Text;Database=D:\;HDR=YES;FMT=Delimited','SELECT * FROM [FileName.csv]')
SELECT Field1, Field2, Field3 FROM DatabaseName

如@ Slogmeister Extraordinaire Quoted所述是正确的。

需要具备以下条件: 1> 已经存在包含列的文件 2> 必须安装Office

面临的错误

1

Msg 7303,Level 16,State 1,Line 1 无法初始化OLE DB提供程序“Microsoft.ACE.OLEDB.12.0”的数据源对象,用于链接服务器“(null)”。

64位 http://download.microsoft.com/download/2/4/3/24375141-E08D-4803-AB0E-10F2E3A07AAA/AccessDatabaseEngine_x64.exe

32位 http://download.microsoft.com/download/f/d/8/fd8c20d8-e38a-48b6-8691-542403b91da1/AccessDatabaseEngine.exe

2

Msg 15281,Level 16,State 1,Line 1 SQL Server阻止对组件“Ad Hoc分布式查询”的语句'OpenRowset / OpenDatasource'的访问,因为此组件已关闭作为该服务器的安全配置的一部分。系统管理员可以使用sp_configure启用对“Ad Hoc分布式查询”的使用。有关启用“Ad Hoc分布式查询”的更多信息,请在SQL Server Books Online中搜索“Ad Hoc分布式查询”。

EXEC sp_configure 'show advanced options', 1
RECONFIGURE
GO
EXEC sp_configure 'ad hoc distributed queries', 0
RECONFIGURE
GO

3
如果您不想使用PowerShell,那么这个答案是对8kb伟大答案的变体。唯一的区别是,选择制表符分隔的输出格式而不是CSV。这样,如果您的数据中有逗号,它就不会跳过Excel中的单元格。此外,如果您将Excel的默认分隔符设置为制表符,您可以直接复制SSMS查询结果(CTRL-A,CTRL-C)并粘贴到Excel中(无需保存为文件并导入Excel):
1. 在SSMS中转到工具>选项>查询结果>SQL Server>结果转换为文本 2. 在右侧更改输出格式为Tab Delimited 3. 点击确定
现在,您可以执行查询,然后使用CTRL-A选择所有结果,然后使用CTRL-C复制到剪贴板,然后切换到Excel 2013(也可能适用于2007,但不确定),并粘贴 - 假设Excel的默认分隔符设置为制表符。 SSMS查询选项屏幕图像

3

使用原生的SQL Server管理工具导出CSV文件(正如@8kb所建议的那样),如果您的数值包含逗号,则无法正常工作,因为SSMS不会将值用双引号括起来。对我而言更加稳健的方法是,简单地复制结果(在网格中单击,然后CTRL-A、 CTRL-C),并将其粘贴到Excel中。然后从Excel中另存为CSV文件。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接