【问题标题】:Export query result to .csv file in SQL Server 2008在 SQL Server 2008 中将查询结果导出到 .csv 文件
【发布时间】:2011-03-11 07:10:30
【问题描述】:

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

【问题讨论】:

标签: sql-server-2008


【解决方案1】:
  1. 打开 SQL Server Management Studio
  2. 转到工具 > 选项 > 查询 结果 > SQL Server > 结果到文本
  3. 在最右边,有一个水滴 名为输出格式的下拉框
  4. 选择逗号分隔并单击确定

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

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

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

【讨论】:

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

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

【讨论】:

    【解决方案3】:

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

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

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

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

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

    祝你好运!

    【讨论】:

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

    您可以使用 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 执行策略就足够了。
    【解决方案5】:

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

    【讨论】:

      【解决方案6】:

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

      【讨论】:

        【解决方案7】:

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

        【讨论】:

          【解决方案8】:

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

          【讨论】:

          • 链接...访问被拒绝?
          【解决方案9】:
          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
          

          【讨论】:

            【解决方案10】:

            如果有问题的数据库是本地的,那么以下可能是将查询结果导出到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"
            

            【讨论】:

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

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

            【讨论】:

              【解决方案12】:

              如果您不想使用 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

              【讨论】:

                【解决方案13】:

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

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

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

                【讨论】:

                【解决方案14】:

                希望 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 搜索和反复试验。您可以看到它选择了一个数据库,定义了输出位置并执行了一个过程。该过程只是一个查询,从数据库中的表中选择要显示的行和列。

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 2010-11-17
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2017-12-31
                  • 2015-01-10
                  相关资源
                  最近更新 更多