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


141

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



您是否需要转义分隔符?到目前为止,大多数答案都假设您没有,实际上并不是所有的CSV。
尼克

@Nick-分隔符通常只包含一个字符串,并且它们之间通常带有引号。请参阅我的答案以查看解决方案。 stackoverflow.com/questions/6115054/…–
MacGyver


我有时会使用Python
LV98

Answers:


168
  1. 打开SQL Server Management Studio
  2. 转到工具>选项>查询结果> SQL Server>结果到文本
  3. 最右边是一个名为“输出格式”的下拉框
  4. 选择逗号分隔,然后单击确定

这是该图片的全屏版本,如下

在此处输入图片说明

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

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


10
答案有点误导...当您按时Ctrl+Shift+F,它仅更改输出模式,如果您已经运行查询,则不会影响结果。为了体现这一点,您必须重新运行查询。当您在“结果到文件”模式下运行它时,它会提示您输入要保存结果的位置。
qJake 2014年

3
应该转到“工具”>“选项”>“查询结果”>“ SQL Server” >“结果为文本”
congusbongus 2014年

45
对我来说,重新运行查询还不够。我不得不关闭查询窗口,打开一个新窗口,然后再次运行查询。
Breandán

3
确认@Breandán评论。新设置不适用于当前打开的查询窗口,必须将其关闭并重新运行查询。
Shinigamae

3
我要做的一件事是将其导出为默认RPT扩展名。完成之后,您只需将其重命名为CSV即可使用。
Thomas Bennett

140

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

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

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

如果结果不是网格格式,请在写查询的位置单击鼠标右键,将鼠标悬停在“结果到”上,然后单击“结果到网格”

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

祝好运!


1
唯一的问题是该方法似乎不允许您设置任何选项。例如,所有NULL在输出文件中都显示为“ NULL”,等等。但是也许有一种我不知道的设置方法。
挪亚

13
令人惊讶的是,即使在SSMS 2012中,它也无法正确引用CSV文本。CHAR / VARCHAR中的逗号或换行符应加引号,但不要加引号。这导致数据转移到新列或新行中。
Eric J.

4
也不会给您列标题。

8
@Don这确实给列标题,如果你进入“查询” - >“查询选项...”,格选项卡,并选中“包含列标题复制或保存结果时”
罗布·怀斯

7
这应该是答案。
pspahn

46

您可以使用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.

如果您面临超时,请添加querytimeout ,例如Invoke-Sqlcmd -ServerInstance MySQLserver123 -Query $QueryFmt -querytimeout 600 | Export-CSV $AttachmentPath
Tilo

1
作为Powershell新手,我需要安装SqlServer模块:(Install-Module -Name SqlServer但不需要管理这些Cmdlet)。另外,我将命令保存在脚本中,直到更改执行策略:,脚本才会运行Set-ExecutionPolicy -ExecutionPolicy Unrestricted -Scope CurrentUser
sandyscott19年

@sandyscott我也是Powershell新手,所以谢谢。无论如何,我认为在这种情况下RemoteSigned执行策略就足够了。
BigBother

14

如果所讨论的数据库是本地数据库,则以下可能是将查询结果导出到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

6

MS Excel->数据->新建查询->从数据库..按照以下步骤


6

基于NS的答案,我有一个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命令let的功能。


6

使用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文件的第一行是所有字段的分隔列表。


3

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



2
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个

消息7303,级别16,状态1,行1无法为链接服务器“(空)”初始化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阻止访问组件“ Ad Hoc Distributed Queries”的状态“ 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

2

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

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

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

SSMS查询选项屏幕的图像


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.