SQL Server System.OutOfMemoryException

时间:2018-08-08 09:09:11

标签: sql-server xml xml-parsing

我正在从60个表中生成XML,并将此xml存储在表中。

Table Name : Final_XML_Table

PK   FK    XML_Content (type xml)
1     1     "XML that I am generating from 60 tables"

当我在query下面运行时,它会给出内存异常:

Select * from Final_XML_Table

我尝试过的事情: 1.文本结果:从XML中我仅获得了几行作为输出窗口中的文本 2.文件结果:我从文件中的XML仅得到几行。

请提出建议,如果有任何更改,在部署时我也必须在服务器的SQL Server上执行此操作。

我还将XML_Data设置为unlimited:

check snapshot

2 个答案:

答案 0 :(得分:1)

这不是答案,但有很多评论...

您能够存储XML的事实清楚地表明,对于数据库而言,XML并不是很大。

您清楚地发现Select * from Final_XML_Table内存不足异常表明SSMS在读取/显示XML时遇到问题。

您可以尝试在此处检查长度:

DECLARE @tbl TABLE (x XML);
INSERT INTO @tbl VALUES('<root><test>blah</test><test /><test2><x/></test2></root>');

SELECT * FROM @tbl;              --This does not work for you
SELECT DATALENGTH(x) FROM @tbl;  --This returns just "82" in this case

可能是由于XML的创建中存在逻辑错误(错误的联接?),XML包含多个/重复的元素。您可以尝试这样的查询来获取节点数,以检查此数字是否现实:

SELECT x.value('count(//*)','int') FROM @tbl

对于上面的示例,这将返回“ 5”

您可能会对原始XML进行同样的操作。

使用以下查询,您可以检索第一层,第二层等的所有节点名称。您可以检查是否还可以:

SELECT firstLevel.value('local-name(.)','varchar(max)') AS l1_node
      ,SecondLevel.value('local-name(.)','varchar(max)') AS l2_node
      --add more
FROM @tbl
OUTER APPLY x.nodes('/*') AS A(firstLevel)
OUTER APPLY A.firstLevel.nodes('*') AS B(SecondLevel)
--add more

而且-当然-您可以打开ResourceMonitor来查看内存的实际使用情况...

返回更多详细信息...

答案 1 :(得分:0)

该错误不是SQL Server错误,是来自SSMS。这意味着SSMS内存不足。

SSMS只是32位应用程序,因此只能寻址2GB的RAM。如果它尝试解决的问题不止于此,则会发生错误。如果您已打开SSMS并返回了一些非常大的数据集,则该RAM将耗尽。

说实话,如果您正在运行类似SELECT * FROM Final_XML_Table的查询,那么我很可能会猜测数据集很大。添加一个WHERE子句,或者不在屏幕上返回该数据集。如果您确实需要查看数据(所有数据),请将其导出到其他内容。但是我非常怀疑,如果您要返回大约2GB的数据,则需要查看行。