【问题标题】:Overcome 2GB limit on XML output in SQL Server克服 SQL Server 中 XML 输出的 2GB 限制
【发布时间】:2019-12-19 18:28:04
【问题描述】:

每天都有一个从 SQL Server 数据库生成 XML 文件的过程。

在内部,它被实现为一系列嵌套在存储过程中的“FOR XML...”查询。 Powershell 脚本执行存储过程并处理输出。

最近,存储过程生成的数据量超过2GB,由于SQL Server中对XML数据类型大小的硬限制,导致进程死亡。

我的问题是,绕过该限制的最佳方法是什么?显然,在 SQL Server 中使用 XML 数据类型是不可行的,但我猜人们会以某种方式确实从 SQL Server 数据库中生成大型 XML 文件。

【问题讨论】:

  • LOB 限制为 2GB。我认为您必须逐步解决此问题...
  • 请分享您的存储过程。 bcp 命令行实用程序可能会生成大于 2GB 的 XML 文件
  • 通常,为了便于管理、测试和传输,数据馈送可以拆分为多个文件。
  • 不幸的是,我无法共享存储过程代码。它生成一个带有单个根、3 个 1 级、8 个 2 级和 ~800K 3 级嵌套数据的 xml。它使用各种带有索引、分组、排序和其他内容的#temptables。大约 80% 的体积被一组特定的 3 级节点(总共 70 万个节点)覆盖。我想我可以将节点拆分为多个块,然后将它们合并(作为文本)在 SQL Server 实例之外(使用一些命令行/Powershell 实用程序),但这很麻烦。我正在寻找可能不需要我重新设计整个事情的简单解决方案。
  • SQL Server 对 XML 数据类型的变量和列有 2GB 的限制。你在存储过程中使用它们吗?

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


【解决方案1】:

请在命令提示符下调整它以在您的环境中进行测试。它正在使用 Windows 身份验证。

"c:\Program Files\Microsoft SQL Server\Client SDK\ODBC\170\Tools\Binn\bcp.exe" "EXEC DBNAME.dbo.usp_name;" queryout "e:\Temp\XMLOutput.xml" -T -x -c -C 1252 -a 32768 -S "DBServerName,1433"

【讨论】:

  • 这绝对是尴尬的。数据超过 2GB 限制的问题似乎是误报。出于某种原因,SSMS 报告输出为 2GB+,但是当我通过 BCP(如您的示例)运行相同的存储过程时,我只得到 220MB 输出 xml 数据,这意味着首先没有问题。如果其他人面临类似问题,我将把它作为一个有效的答案。
  • 需要注意的几件事:(1) 使用 -w 代替 -c 以使其与 Unicode 数据一起工作,然后 (2) 请注意 bcp 生成带有 BOM 的文件 (FF- FE) 如果需要,可能需要在下游删除,最后 (3) 使用 -r 选项来避免 XML 标记中间的随机换行符。除此之外,该方法效果很好。
猜你喜欢
  • 2021-12-23
  • 1970-01-01
  • 2015-11-28
  • 1970-01-01
  • 2021-06-09
  • 1970-01-01
  • 2010-11-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多