【发布时间】:2011-04-27 07:03:19
【问题描述】:
我有一个将 XML 文档作为参数的存储过程,其结构类似于以下内容:
<grandparent name="grandpa bob">
<parent name="papa john">
<children>
<child name="mark" />
<child name="cindy" />
</children>
</parent>
<parent name="papa henry">
<children>
<child name="mary" />
</children>
</parent>
</grandparent>
我的要求是“展平”这些数据,以便将其插入到临时表中并在过程中进一步操作,因此上述 XML 变为:
Grandparent Name Parent Name Child Name
---------------- --------------- ---------------
grandpa bob papa john mark
grandpa bob papa john cindy
grandpa bob papa henry mary
目前正在使用 SQL Server XML 节点完成:
SELECT
VIRT.node.value('../../../@name','varchar(15)') 'Grandparent Name',
VIRT.node.value('../../@name','varchar(15)') 'Parent Name',
VIRT.node.value('@name','varchar(15)') 'Child Name'
FROM
@xmlFamilyTree.nodes('/grandparent/parent/children/child') AS VIRT(node)
这很有效,直到我开始在过程中抛出大量数据(即 1000+ child 节点),此时它会停止并需要 1 到 2 分钟才能执行。我认为这可能是因为我从最低级别 (<child) 开始,然后每次出现都遍历 XML 文档。将这个单个查询分成 3 个块(每个节点一个我需要数据的块)会提高性能吗?鉴于这些节点上都没有我可以用来加入备份的“密钥”,任何人都可以提供任何指示我可以如何去做吗?
【问题讨论】:
-
从 xml 创建基于行的数据的过程通常称为“粉碎”,顺便说一句。
标签: sql xml sql-server-2005 tsql sql-server-2008