在 SQL Server 2008 中将查询结果导出到 .csv 文件

Posted

技术标签:

【中文标题】在 SQL Server 2008 中将查询结果导出到 .csv 文件【英文标题】:Export query result to .csv file in SQL Server 2008 【发布时间】:2010-07-02 21:31:46 【问题描述】:

如何?

【问题讨论】:

How to export data as CSV format from SQL Server using sqlcmd?的可能重复 您需要转义分隔符吗?到目前为止,大多数答案都假设您没有,这并不是 CSV 的全部内容。 @Nick - 通常分隔符仅包含在字符串中,并且通常在它们周围有引号。请参阅我的答案以查看解决方案。 ***.com/questions/6115054/… 相关帖子 - Export table from database to csv file、SQL Server 2008 - use cmd to output with headers to .csv & Saving results with headers in Sql Server Management Studio。 我有时会使用 Python 【参考方案1】:
    打开 SQL Server Management Studio 转到工具 > 选项 > 查询 结果 > SQL Server > 结果到文本 在最右边,有一个水滴 名为输出格式的下拉框 选择逗号分隔并单击确定

Here's a full screen version of that image, below

这会将您的查询结果显示为逗号分隔的文本。

将查询结果保存到文件:Ctrl + Shift + F

【讨论】:

答案有点误导......当你按下Ctrl+Shift+F时,它只会改变输出模式,如果你已经运行了查询,它不会影响结果。为了反映这一点,您必须重新运行查询。当您在“结果到文件”模式下运行它时,它应该会提示您将结果保存在哪里。 应该转到工具 > 选项 > 查询结果 > SQL Server > 结果到文本 重新运行查询对我来说还不够。我不得不关闭查询窗口,打开一个新窗口,然后再次运行查询。 确认@Breandán 评论。新设置不适用于当前打开的查询窗口,必须关闭它们并重新运行查询。 我必须做的一件事就是将它导出为默认的 RPT 扩展。之后,您只需将其重命名为 CSV 即可。【参考方案2】:

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

    使用默认设置运行查询(以网格格式放置结果,如果您的不是网格格式,请参见下文)

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

如果您的结果不是网格格式,请右键单击您编写查询的位置,将“Results To”悬停并单击“Results To Grid”

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

祝你好运!

【讨论】:

唯一的问题是这种方法似乎不允许您设置任何选项。例如,输出文件中的所有 NULL 都显示为“NULL”等。也许有一种我不知道的方法来设置它。 令人惊讶的是,即使在 SSMS 2012 中,这也不能正确引用 CSV 的文本。应该引用 CHAR/VARCHAR 中的逗号或换行符,但不是。这会导致数据转移到新列或新行中。 也不给你列标题。 @Don 如果您进入“查询”->“查询选项...”,网格选项卡并选中“复制或保存结果时包含列标题”,这确实会给出列标题 这应该是答案。【参考方案3】:

您可以使用 PowerShell

$AttachmentPath = "CV File location"
$QueryFmt= "Query"

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

【讨论】:

谢谢!这是唯一对我有用的建议。处理正确转义 如果可以的话,+10。只有处理转义的答案。为了让它运行,我必须在脚本顶部添加两行:Add-PSSnapin SqlServerCmdletSnapin100Add-PSSnapin SqlServerProviderSnapin100 如果您遇到超时,请添加 querytimeout ,例如Invoke-Sqlcmd -ServerInstance mysqlserver123 -Query $QueryFmt -querytimeout 600 | Export-CSV $AttachmentPath 作为 Powershell 新手,我需要安装 SqlServer 模块:Install-Module -Name SqlServer(但不需要插入这些 Cmdlet)。另外,我将命令保存在脚本中,直到我更改执行策略才会运行:Set-ExecutionPolicy -ExecutionPolicy Unrestricted -Scope CurrentUser @sandyscott 我也是 Powershell 新手,谢谢。无论如何,我认为在这种情况下,RemoteSigned 执行策略就足够了。【参考方案4】:

如果有问题的数据库是本地的,那么以下可能是将查询结果导出到CSV 文件的最可靠的方法(即给予您最大的控制权)。

    复制查询。 在对象资源管理器中右键单击相关数据库。 选择“任务”>>“导出数据...” 配置您的数据源,然后单击“下一步”。 选择“平面文件”或“Microsoft Excel”作为目标。 指定文件路径。 如果使用平面文件,请根据需要进行配置。如果使用 Microsoft Excel,请选择“Excel 2007”(以前的版本的行数限制为 64k) 选择“编写查询以指定要传输的数据” 粘贴第 1 步中的查询。 单击下一步>>查看映射>>单击下一步>>选择“立即运行”>>单击“完成”两次。

在详尽地完成了这个过程之后,我发现以下是最好的选择

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"

【讨论】:

如果您遇到超时,请添加 querytimeout ,例如Invoke-Sqlcmd -ServerInstance MySQLserver123 -Query $QueryFmt -querytimeout 600 | Export-CSV $AttachmentPath 您的第一个解决方案非常有效。它还很好地处理了回车问题。【参考方案5】:

使用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

但是,有几点需要注意:

    您需要有可用的 Microsoft.ACE.OLEDB.12.0 提供程序。 Jet 4.0 提供程序也可以工作,但它很古老,所以我改用了这个。

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

【讨论】:

【参考方案6】:

MS Excel -> 数据 -> 新查询 -> 从数据库..按照步骤操作

【讨论】:

【参考方案7】:

基于 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 command-let。

【讨论】:

【参考方案8】:

如果您的值包含逗号,则使用本机 SQL Server Management Studio 技术导出到 CSV(如 @8kb 建议的那样)不起作用,因为 SSMS 不会将值用双引号括起来。一种对我有用的更可靠的方法是简单地复制结果(在网格内单击,然后按 CTRL-A、CTRL-C)并将其粘贴到 Excel 中。然后从 Excel 中另存为 CSV 文件。

【讨论】:

【参考方案9】:

您可以使用 QueryToDoc (http://www.querytodoc.com)。它允许您针对 SQL 数据库编写查询并将结果(在您选择分隔符后)导出到 Excel、Word、html 或 CSV

【讨论】:

【参考方案10】:
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 引用是正确的。

需要有 1> 文件已经存在列 2> 需要安装Office

面临的错误

1

消息 7303,第 16 级,状态 1,第 1 行 无法为链接服务器“(null)”初始化 OLE DB 提供程序“Microsoft.ACE.OLEDB.12.0”的数据源对象。”

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

消息 15281,第 16 级,状态 1,第 1 行 SQL Server 阻止了对组件“即席分布式查询”的声明“OpenRowset/OpenDatasource”的访问,因为该组件作为该服务器安全配置的一部分被关闭。系统管理员可以使用 sp_configure 启用“即席分布式查询”。有关启用“即席分布式查询”的详细信息,请在 SQL Server 联机丛书中搜索“即席分布式查询”。

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

【讨论】:

【参考方案11】:

如果您不想使用 Powershell,则此答案是 8kb 出色答案的变体。唯一的区别是,不是选择 CSV 作为输出格式,而是选择制表符分隔。这样,如果您的数据中有逗号,它就不会跳过 Excel 中的单元格。此外,如果您将 Excel 的默认分隔符设置为制表符,您可以简单地复制所有 SSMS 查询结果(CTRL-A、CTRL-C)并粘贴到 Excel(无需另存为文件并导入 Excel ):

在 SSMS 中,转到工具 > 选项 > 查询结果 > SQL Server > 结果到文本 将最右侧的输出格式更改为制表符分隔 点击确定

现在您可以执行查询,然后按 CTRL-A 选择所有结果,然后按 CTRL-C 复制到剪贴板,然后切换到 Excel 2013(也可以在 2007 中工作,不确定)并粘贴 --假设 Excel 的默认分隔符设置为制表符。

Image of SSMS Query Options Screen

【讨论】:

【参考方案12】:

这里还有一个值得一提的方法:

SQLCMD -S SEVERNAME -E -Q "SELECT COLUMN FROM TABLE" -s "," -o "c:\test.csv"

注意:我没有看到任何网络管理员允许您运行 powershell 脚本

【讨论】:

仅供参考,这个答案已经在***.com/questions/425379/…的“可能重复”链接中进行了更详细的讨论【参考方案13】:

希望 10 年还不算晚,我在 Windows Scheduler 中使用过这个;

"C:\Program Files\Microsoft SQL Server\110\Tools\Binn\SQLCMD.EXE"
-S BLRREPSRVR\SQLEXPRESS -d Reporting_DB -o "C:\Reports\CHP_Gen.csv" -Q "EXEC dbo.CHP_Generation_Report" -W -w 999 -s ","

它打开 sql 命令 .exe 并运行为 sql 命令设计的脚本。 sql 命令脚本非常易于使用,只需通过一些 google 搜索和反复试验。您可以看到它选择了一个数据库,定义了输出位置并执行了一个过程。该过程只是一个查询,从数据库中的表中选择要显示的行和列。

【讨论】:

【参考方案14】:

是的,当您可以直接访问服务器时,所有这些都是可能的。但是,如果您只能从 Web / 应用程序服务器访问服务器怎么办?嗯,情况是我们很久以前的情况,解决方案是 SQL Server Export to CSV

【讨论】:

链接...访问被拒绝?

以上是关于在 SQL Server 2008 中将查询结果导出到 .csv 文件的主要内容,如果未能解决你的问题,请参考以下文章

在 SQL Server 2008 中将 NVARCHAR 转换为 INT 数据类型

如何在 Sql Server 2008 R2 中将列转换为行?

SQL Server 2008 R2 - 将查询结果保存为 phpmyadmin 可读的 SQL 语句?

如何将SQL server 2008 里的查询结果导出到 Excel 表内?

sql server2008 怎么用like 查询 结果里面带引号的内容

多个连接子查询 SQL Server 2008