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

160 人关注

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

5 个评论
Nick
你需要将你的分隔符转义吗? 到目前为止,大多数的答案都认为你不需要,这其实并不是CSV的全部。
@Nick - 一般来说,定界符只包含一个字符串,而且它们周围通常有引号。 请看我的回答,看看这个问题的解决方案。 stackoverflow.com/questions/6115054/ ...
我有时会使用Python
sql-server-2008
Gold
Gold
发布于 2010-07-03
14 个回答
8kb
8kb
发布于 2016-06-12
已采纳
0 人赞同
  • 打开SQL服务器管理工作室
  • 转到工具 > 选项 > 查询 结果 > SQL Server > 结果到文本
  • 在最右边,有一个下拉框 下拉框,称为输出格式
  • 选择逗号分隔,然后点击确定
  • 下面是该图片的全屏版本

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

    要把查询结果保存到一个文件中。Ctrl + Shift + F

    这个答案有点误导......当你按下 Ctrl+Shift+F ,它只改变输出模式,如果你已经运行了查询,它不会影响结果。为了使这一点得到反映,你必须重新运行查询。当你在 "结果到文件 "模式下运行它时,它应该提示你想把结果保存在哪里。
    应该是转到工具>选项>查询结果> SQL服务器 >结果到文本
    重新运行查询对我来说是不够的。我不得不关闭查询窗口,打开一个新窗口,然后再次运行查询。
    确认了@Breandán的评论。新的设置将不适用于当前打开的查询窗口,必须关闭它们并重新运行查询。
    我不得不做的一件事是把它导出为默认的RPT扩展名。这样做之后,你可以简单地把它重命名为CSV,就可以了。
    Ricketts
    Ricketts
    发布于 2016-06-12
    0 人赞同

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

  • 用默认设置运行你的查询(将结果放在网格格式中,如果你的查询不是网格格式,见下文)

  • 在网格结果上点击右键,点击 "将结果另存为 "并保存。

  • 如果你的结果不是网格格式,右击你写查询的地方,悬停 "结果到 "并点击 "结果到网格"

    请注意,你不会捕捉到列的标题!

    祝您好运!

    Noah
    唯一的问题是,这种方法似乎不能让你设置任何选项。 例如,所有的NULL在输出文件中显示为 "NULL",等等。 不过,也许有一种我不知道的方法可以设置这个。
    令人惊讶的是,即使在SSMS 2012中,这也不能为CSV正确地引用文本。 在CHAR/VARCHAR中的逗号或新行应该被加引号,但却没有。 这导致数据转移到新的列或新的行中。
    令人惊讶的是,即使在SSMS 2012中,这也不能为CSV正确地引用文本。 在CHAR/VARCHAR中的逗号或新行应该被加引号,但却没有。 这导致数据转移到新的列或新的行中。
    Don
    也不给你列标题。
    我一直在使用这种方法处理少量的数据。我目前有一个超过800,000行的结果。我得到一个系统内存不足的错误!
    N.S
    N.S
    发布于 2016-06-12
    0 人赞同

    你可以使用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
    Tilo
    如果你面临超时,请添加 querytimeout ,例如 Invoke-Sqlcmd -ServerInstance MySQLserver123 -Query $QueryFmt -querytimeout 600 | Export-CSV $AttachmentPath
    作为Powershell的新手,我需要安装SqlServer模块。 Install-Module -Name SqlServer (但不需要在这些Cmdlets中设置)。另外,我把这些命令保存在一个脚本中,在我改变执行策略之前,这个脚本不会运行: Set-ExecutionPolicy -ExecutionPolicy Unrestricted -Scope CurrentUser
    @sandyscott 我也是一个Powershell新手,所以谢谢你。总之我认为在这种情况下, RemoteSigned 执行策略就足够了。
    0 人赞同

    如果有关的数据库是本地的,以下可能是将查询结果导出到 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"
        
    Tilo
    如果你面临超时,请添加 querytimeout ,例如 Invoke-Sqlcmd -ServerInstance MySQLserver123 -Query $QueryFmt -querytimeout 600 | Export-CSV $AttachmentPath
    ABH
    你的第一个解决方案工作得很好。它也很好地处理了回车的问题。
    Slogmeister Extraordinaire
    Slogmeister Extraordinaire
    发布于 2016-06-12
    0 人赞同

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

  • tichra
    tichra
    发布于 2016-06-12
    0 人赞同

    MS Excel -> 数据 -> 新建查询 -> 来自数据库 ......请按步骤操作

    BeowulfNode42
    BeowulfNode42
    发布于 2016-06-12
    0 人赞同

    在N.S的回答的基础上,我有一个PowerShell脚本,可以导出到 CSV 文件,在字段周围加上引号,并以逗号分隔,它跳过文件中的头信息。

    add-pssnapin sqlserverprovidersnapin100
    add-pssnapin sqlservercmdletsnapin100
    $qry = @"
    Select
     tablename
    Invoke-Sqlcmd -ServerInstance Server -Database DBName -Query $qry | convertto-CSV -notype | select -skip 1  > "full path and filename.csv"
    

    前两行启用了使用Invoke-SqlCmd命令-let的能力。

    Johnny Oshika
    Johnny Oshika
    发布于 2016-06-12
    0 人赞同

    如果你的数值包含逗号,使用本地的SQL Server Management Studio技术导出CSV(如@8kb建议的那样)是行不通的,因为SSMS不会用双引号包裹数值。 对我来说,一个更强大的方法是简单地复制结果(点击网格内,然后CTRL-A,CTRL-C)并将其粘贴到Excel。 然后从Excel中保存为CSV文件。

    Robert
    Robert
    发布于 2016-06-12
    0 人赞同

    你可以使用QueryToDoc (http://www.querytodoc.com) 。它可以让你写一个针对SQL数据库的查询,并将结果--在你选择分隔符之后--导出到Excel、Word、HTML或CSV中。

    sam
    sam
    发布于 2016-06-12
    0 人赞同
    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

    面临的错误

    Msg 7303, Level 16, State 1, Line 1 不能为链接的服务器"(null) "初始化OLE DB提供者 "Microsoft.ACE.OLEDB.12.0 "的数据源对象。"

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

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

    Msg 15281, Level 16, State 1, Line 1 SQL Server阻止了对组件 "Ad Hoc Distributed Queries "的STATEMENT "OpenRowset/OpenDatasource "的访问,因为该组件在该服务器的安全配置中被关闭。系统管理员可以通过使用sp_configure启用 "Ad Hoc Distributed Queries "的使用。关于启用 "Ad Hoc Distributed Queries "的更多信息,请在SQL Server Books Online搜索 "Ad Hoc Distributed Queries"。

    EXEC sp_configure 'show advanced options', 1
    RECONFIGURE
    EXEC sp_configure 'ad hoc distributed queries', 0
    RECONFIGURE
        
    TomWalker
    TomWalker
    发布于 2016-06-12
    0 人赞同

    如果你不想使用Powershell,这个答案是对8kb伟大答案的一个变种。唯一的区别是,不要选择CSV作为输出格式,而要选择Tab Delimited。这样,如果你的数据中有逗号,它就不会在Excel中跳过单元格。另外,如果你将Excel的默认分隔符设置为制表符,你可以简单地将SSMS的查询结果全部复制(CTRL-A,CTRL-C)并粘贴到Excel中(不需要保存为文件并导入到Excel)。

  • 在SSMS中,进入工具 > 选项 > 查询结果 > SQL Server > 结果到文本
  • 将最右边的输出格式改为 Tab Delimited
  • 现在你可以执行你的查询,然后用CTRL-A选择所有的结果,然后用CTRL-C复制到剪贴板,然后切换到Excel 2013(可能也适用于2007,不确定)并粘贴--假设Excel的默认分隔符被设置为制表符。

    SSMS查询选项屏幕的图片

    Ayaz Hoda
    Ayaz Hoda
    发布于 2016-06-12
    0 人赞同

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

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

    注意:我没有看到任何网络管理员让你运行 powershell 脚本。

    顺便说一下,这个答案已经在 stackoverflow.com/questions/425379/ 的 "可能的重复 "链接中得到了更详细的讨论。
    Ronan
    Ronan
    发布于 2016-06-12
    0 人赞同

    我希望10年不会太晚,我在Windows Scheduler中使用这个。

    "C:\Program Files\Microsoft SQL Server\110\Tools\Binn\SQLCMD.EXE"