【问题标题】:How to save SQL query result to XML file on disk如何将 SQL 查询结果保存到磁盘上的 XML 文件
【发布时间】:2016-08-06 20:40:18
【问题描述】:

我想将表从 SQL Server 2012 导出到 XML 文件。我找到了 nice answerhere 如何从 SQL Server 数据库查询中生成 XML 结果,但我仍然缺少如何将此结果物理保存到文件中。

SQL 查询是:

SELECT [Created], [Text]
FROM [db304].[dbo].[SearchHistory]
FOR XML PATH('Record'), ROOT('SearchHistory')

我使用 Microsoft SQL Server Management Studio 来执行这个结果。我在结果窗口中看到 XML,但无法保存。

上下文菜单中有“将结果另存为..”,但是使用此选项时,我的 8GB 内存用完了 98900 行。

有没有办法将此查询直接保存到磁盘上的 XML 文件中?

【问题讨论】:

    标签: sql-server xml sql-server-2012


    【解决方案1】:

    您还可以将 SQL Server 的扩展存储过程导出到 xml 文件。

    但您需要先配置 sql server 才能使用它。

    EXEC master.dbo.sp_configure 'show advanced options', 1
    RECONFIGURE
    EXEC master.dbo.sp_configure 'xp_cmdshell', 1
    RECONFIGURE
    

    在 SQL Server 中启用 xp_cmdshel 后。您可以使用以下命令将数据导出到 xml 文件。

    EXEC xp_cmdshell 'bcp "SELECT [Created], [Text] FROM [db304].[dbo].[SearchHistory] FOR XML PATH(''Record''), ROOT(''SearchHistory'')" queryout "C:\bcptest.xml" -T -c -t,'
    

    【讨论】:

    • 谢谢,我可以导出整个表格,但无法使用 UTF-8。当我使用 -C65001 参数时,我收到消息 Error = [Microsoft][SQL Server Native Client 11.0]此版本的 SQL Server Native Client 不支持 UTF-8 编码(代码页 65001)。我需要升级到 SQL Server 2016,这个功能已经支持 UTF8。
    • 您好,这正是我要找的。请解释一下“EXEC xp_cmdshell 'bcp”SELECT [Created]”的 bcp 是什么,谢谢。
    【解决方案2】:

    您始终可以使用 SSMS 中的“结果到文件”选项:

    这应该将查询执行的结果直接输出到磁盘上的文件中

    【讨论】:

    • 这就是我要找的,但不幸的是文件被裁剪了,文件末尾丢失了。 :-( XML 在元素内部被中断。但是 SSMS 说:“查询已成功执行”。
    • @qub1n: 真不幸.....在这种情况下,我想我唯一的选择是编写一个小 C# 程序来运行查询,获取结果,并尝试将它们保存到磁盘 - 可能分块执行(例如一次 1000 行左右)以避免“OutOfMemoryException”...
    • 如果有大的xml文件这样的大内容,只写文件的一部分。
    【解决方案3】:

    对于 SQL Server 2012 中的这项工作来说是一件很痛苦的事情。最后我最终将它更新到 SQL Server 2014,因为 sqlcmd 中已经支持 SQL UTF-8 文件。

    1. 创建 SQL 查询并将其保存到文件中。
    2. 运行以下:

      sqlcmd -S -U sa -P sapassword -i inputquery_file_name -C65001 -o outputfile_name

    【讨论】:

    • 对我来说,有必要添加 -y 0 选项以确保导出整个 XML,而不仅仅是前 256 个字符。
    【解决方案4】:

    此示例适用于我最大 2GB 的结果集。

    EXEC master.dbo.sp_configure 'show advanced options', 1
    RECONFIGURE
    EXEC master.dbo.sp_configure 'xp_cmdshell', 1
    RECONFIGURE
    
    DROP TABLE IF EXISTS ##AuditLogTempTable
    
    SELECT A.MyXML
    INTO ##AuditLogTempTable
    FROM
    (SELECT CONVERT(nvarchar(max), 
        (
                SELECT
                    A.*
                FROM
                    [dbo].[AuditLog] A
                    JOIN ImportProviderProcesses IPP ON IPP.ImportType = 'Z' 
                      AND A.OperatorID = IPP.OperatorID 
                      AND A.AuditTypeID in ( '400','424','425' )
                WHERE
                    A.[PostTime] >= IPP.StartTime
                    AND A.[PostTime] <= dateadd(second, 90, IPP.StartTime) 
                    FOR XML PATH('Record'), ROOT('AuditLog')
            )
        , 0
        )   AS MyXML
    ) A
    
    EXEC xp_cmdshell 'bcp "SELECT MyXML FROM ##AuditLogTempTable" queryout "D:\bcptest1.xml" -T -c -t,' 
        
    

    【讨论】:

      猜你喜欢
      • 2010-12-03
      • 1970-01-01
      • 1970-01-01
      • 2016-07-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多