我有一个存储过程,它采用 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 个块(每个需要从中获取数据的节点一个)会提高性能吗?鉴于这些节点上都没有我可以用来连接备份的“密钥”,任何人都可以提供任何指示,我如何能够做到这一点?