SQL Server 2008 错误 - XML 解析:文档解析需要太多内存
Posted
技术标签:
【中文标题】SQL Server 2008 错误 - XML 解析:文档解析需要太多内存【英文标题】:SQL Server 2008 Error - XML parsing: document parsing required too much memory 【发布时间】:2013-08-17 08:11:11 【问题描述】:我们在 SQL Server 2008 中遇到了在 XML 解析器崩溃之前单个 XML 节点可以拥有的最大属性数。
我们收到的错误是:
Msg 6303, Level 16, State 1, Line 1
XML parsing: Document parsing required too much memory
这有点误导。 将字符串转换为 XML 数据类型(或表列)时出现问题。
SELECT CONVERT(XML, '<DataNode><Data attr1="a" attr2="b" XXXXX /></DataNode>')
其中XXXXX其实是另外8191个属性。
我们的数据集一开始就包含 10,066 个属性。 当我们将属性数量减少到 8,192 时,它工作正常。然而,8,193 个属性崩溃了。
它似乎与数据的大小没有任何特别的关系(100MB 或 60KB 无关紧要 - 我们根据属性计数得到相同的失败/成功)
那么,SQL Server 有什么办法可以改变这个限制吗?
我们的 C# 应用程序没有此限制,因此 C# 中完全有效的 XML 文档不能存储在 SQL Server 的 XML 数据列中。
任何人都可以提供任何帮助,我们将不胜感激。此时无法更改数据结构,因为它需要重写具有数百个组件的整个应用程序框架的数据处理功能。
PS:我已经告知管理层,当应用程序将数据存储为单个节点的属性而不是树时,这种情况是多么荒谬,但这是我必须处理的:-(
编辑:我们已经在具有 2GB RAM 的服务器和具有 32GB RAM 的服务器上尝试了 SQL Server 2008 32 位和 64 位版本 - 所有版本和环境都有相同的问题。
更新:
我已经在 SQL Server 2012 中尝试过,当有 8,193 个属性并且字符串的长度也超过给定大小(测试字符串的长度为 833K)时,它会失败,但在相同长度时有效字符串只有 8,192 个属性。
但是,我有一个包含 12,000 个属性的更短的字符串 (193K),它适用于 SQL Server 2012 和 SQL Server 2008)
所以,当被转换的字符串超过一定大小时,它似乎是属性数量的组合。 这变得更有趣了!
感谢到目前为止的反馈!
更新 2:
在使用较小的字符串 (270K) 进行进一步测试后,我仍然达到了 16,384 的属性限制... 16,385 属性失败! 所以,它肯定会以 8K 属性的增量发生,具体取决于字符串长度的组合!!
【问题讨论】:
能否只返回一个 varchar(max) 给 C# 应用程序,让应用程序将其转换为正确的 XML 格式? 不幸的是,问题不在于 C#,我们试图将 XML 插入 SQL Server 中的 XML 列中,但由于它试图处理的属性数量而出现此错误。 C# 似乎没有 SQL Server 的 XML 解析所具有的 8,192 属性限制。 @doublehelix - 好吧,相反的问题适用。你不能在外部(例如在 C# 中)转换为 XML 并将 XML 直接传递给 SQL 以进行插入吗? 我试图在 SQLServer2012 上将包含 10,100 个属性的字符串转换为 xml 数据类型,它可以正常工作 嘿@Tomalak - 使用元素时似乎没有限制。具有 25,000 个节点/元素的 2MB 字符串完美运行。 (如 MSDN 文档中所述,XML 数据类型的实际限制是 2GB ......它似乎是专门破解属性的解析器) 【参考方案1】:8191 属性听起来太多了。 如果看起来您正在尝试将实际数据存储在属性中 - 显然 SQL Server 解析器在这里有一个限制。
请参阅此处的文章: http://blogs.msdn.com/b/sqlprogrammability/archive/2006/05/23/605299.aspx?Redirected=true
当需要一个类型进行验证时,验证器会加载它的 从元数据定义并将其编译成适合的格式 快速验证。为了防止任何一种类型使用过多 内存,SQL Server 将编译类型的大小限制为 1 MB。 SQL Server 编译所有类型并在架构时执行此检查 被导入是为了避免接受超出限制的类型。
我建议改变您使用 XML 并将信息存储在元素内的方式。
见 http://www.ibm.com/developerworks/library/x-eleatt/index.html 和 http://www.w3schools.com/xml/xml_attributes.asp
【讨论】:
嘿@AlexTheDeveloper,感谢您的反馈。我们在过去已经看到了这些限制,并且知道深度限制,我们不使用 xsd,因为我们对每个记录类型都有一个动态数据结构。这绝对是一种糟糕的数据存储方式,如果有机会我很想完全重写整个想法,但是该架构现在仍然存在,因为该产品已有 7 年历史,并且在数十台服务器上拥有数十亿条记录客户端基础设施。看起来我们正在放弃内部 XML 数据类型并将 XML/XPath 功能移至 C# 层...再次感谢!以上是关于SQL Server 2008 错误 - XML 解析:文档解析需要太多内存的主要内容,如果未能解决你的问题,请参考以下文章
SQL Server 2008 installation fails There was an error generating the XML document. Error code 0x84B1
将 XML 插入 SQL Server 时如何解决“无法切换编码”错误
将每个 xml 节点插入到 sql server 2008 表中
在 SQL Server 2008 中使用 FOR XML PATH 提高 SQL 查询的性能
Sql server2008! SQL server服务无法启动,并显示错误17113, 修复Sql server2008失败!