在 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 SqlServerCmdletSnapin100
和 Add-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 表内?