6

我们在 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 个属性。

但是,我有一个更短的字符串 (193K),包含 12,000 个属性,它适用于 SQL Server 2012 和 SQL Server 2008)

因此,当被转换的字符串超过一定大小时,它似乎是属性数量的组合。这变得更有趣了!

感谢您迄今为止的反馈!

更新 2:

在使用较小的字符串(270K)进行进一步测试后,我仍然达到了 16,384 的属性限制...... 16,385 个属性失败了!因此,它肯定会以 8K 属性的增量发生,具体取决于字符串长度的组合!

4

1 回答 1

2

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.htmlhttp://www.w3schools.com/xml/xml_attributes.asp

于 2013-08-20T13:13:40.270 回答