【发布时间】: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 ......它似乎是专门破解属性的解析器)
标签: c# sql sql-server xml sql-server-2008