SQL Server 2008错误 - XML解析:文档解析需要太多内存

dou*_*lix 6 c# xml sql sql-server sql-server-2008

我们已经在SQL Server 2008中找到了XML解析器崩溃之前单个XML节点可以拥有的最大属性数.

我们收到的错误是:

Msg 6303, Level 16, State 1, Line 1
XML parsing: Document parsing required too much memory
Run Code Online (Sandbox Code Playgroud)

这有点误导.将字符串转换为XML数据类型(或表列)时会出现问题.

SELECT CONVERT(XML, '<DataNode><Data attr1="a" attr2="b" XXXXX /></DataNode>')
Run Code Online (Sandbox Code Playgroud)

其中XXXXX实际上是另一个8191属性.

总的来说,我们的数据集包含10,066个属性.当我们将属性数量减少到8,192时,它工作正常.然而,8,193个属性崩溃了.

它似乎没有任何与数据大小有关的任何内容(100MB或60KB无关紧要 - 我们根据属性计数获得相同的失败/成功)

那么,有没有什么可以用SQL服务器来改变这个限制?

我们的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属性的增量发生,具体取决于字符串长度的组合!

小智 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