Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# SQL Server 2008错误-XML解析:文档解析需要太多内存_C#_Sql_Sql Server_Xml_Sql Server 2008 - Fatal编程技术网

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

C# SQL Server 2008错误-XML解析:文档解析需要太多内存,c#,sql,sql-server,xml,sql-server-2008,C#,Sql,Sql Server,Xml,Sql Server 2008,在SQLServer2008中,我们在XML解析器崩溃之前单个XML节点可以拥有的最大属性数方面遇到了难题 我们收到的错误是: Msg 6303, Level 16, State 1, Line 1 XML parsing: Document parsing required too much memory 这有点误导。 将字符串转换为XML数据类型或表列时发生Out问题 SELECT CONVERT(XML, '<DataNode><Data attr1="a" attr2

在SQLServer2008中,我们在XML解析器崩溃之前单个XML节点可以拥有的最大属性数方面遇到了难题

我们收到的错误是:

Msg 6303, Level 16, State 1, Line 1
XML parsing: Document parsing required too much memory
这有点误导。 将字符串转换为XML数据类型或表列时发生Out问题

SELECT CONVERT(XML, '<DataNode><Data attr1="a" attr2="b" XXXXX /></DataNode>')
其中XXXXX实际上是另一个8191属性

我们的数据集总共包含10066个属性。 当我们将属性的数量减少到8192时,它工作得很好。然而,8193个属性崩溃

它似乎与100MB或60KB数据的大小没有任何特别的关系,这无关紧要——我们根据属性计数获得相同的失败/成功

那么,使用SQL server可以做些什么来改变这个限制呢

我们的C应用程序没有这个限制,所以C中完全有效的XML文档不能存储在SQLServer的XML数据列中

任何人能提供的任何帮助都将不胜感激。此时无法更改数据结构,因为它需要重新编写包含数百个组件的整个应用程序框架的数据处理功能

PS:我已经告诉管理层,当应用程序将数据存储为单个节点的属性而不是树时,情况是多么荒谬,但这就是我必须处理的:-

编辑:我们已经在SQL Server 2008 32位和64位版本的服务器上尝试过这种方法,该服务器具有2GB RAM,而服务器具有32GB RAM—所有版本和环境都有相同的问题

更新:

我在SQL server 2012中尝试过这种方法,但当有8193个属性且字符串长度超过给定大小时失败测试字符串的长度为833K,但当相同长度的字符串只有8192个属性时有效

但是,我有一个更短的字符串193K,有12000个属性,可以在SQLServer2012和SQLServer2008中使用

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

感谢到目前为止的反馈

更新2:

在使用更小的字符串270K进行进一步测试后,我仍然达到属性限制16384。。。16385属性失败!
因此,它肯定是以8K属性的增量发生的,这取决于字符串长度的组合

8191属性听起来太多了。 如果您试图在属性中存储实际数据,那么显然SQL Server解析器在这里有一个限制

见本文:

当验证需要某个类型时,验证器将加载其 定义,并将其编译为适合 快速验证。为了防止任何一种类型使用过多 在内存中,SQL Server将编译类型的大小限制为1 MB。 SQL Server编译所有类型,并在架构更改时执行此检查 导入是为了避免接受超出限制的类型

我建议改变使用XML的方式,并将信息存储在元素中

看 和

您能否只向C应用程序返回一个varcharmax,并让应用程序将其转换为正确的XML格式?不幸的是,问题不在于C,我们正在尝试将XML插入SQL server中的XML列中,由于它试图处理的属性数量太多,因此出现此错误。C似乎没有SQL server的XML解析所具有的8192属性限制。@doublehelix-好吧,相反的问题适用。您不能在外部转换为XML(例如在C中)并将XML直接传递给SQL进行插入吗?我试图在SQLServer2012上将包含10100个属性的字符串转换为XML数据类型,它可以正常工作@Tomalak-使用元素时似乎没有限制。带有25000个节点/元素的2MB字符串可以完美地工作。如MSDN文档所述,XML数据类型的实际限制是2GB。。。似乎是解析器专门针对属性进行了破解,他们是@AlexTheDeveloper,感谢您的反馈。我们在过去已经看到了这些限制,并且知道深度限制,我们不使用xsd,因为我们有每个记录类型的动态数据结构。这绝对是一种糟糕的数据存储方式,如果有机会,我很想完全重写整个think,但是,由于该产品已有7年的历史,并且在客户端基础设施中的数十台服务器上有数十亿条记录,因此该模式将暂时保留。看起来我们抛弃了内部XML数据类型,将XML/XPath功能移到了C层。。。再次感谢!