我有一个存储过程,它将存储XML文档作为参数,其结构与以下内容相似: r1 ^- _, N8 M0 h: O 我的要求是展平这个数据,以便在这个过程中插入临时表并进一步操作。因此,上述数据XML变为: $ } a/ _; X& y* ~/ KGrandparent Name Parent Name Child Name---------------- --------------- ---------------grandpa bob papa john markgrandpa bob papa john cindygrandpa bob papa henry mary这是目前使用的SQL Server XML节点完成: , G* r& k! u- d: G% sSELECT 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分钟才能实施。我想这可能是因为我从最低水平开始( 7 g D; p4 s* r ( D& z" W; t; ]! |5 A( t4 H2 c9 h' M1 l解决方案: ^2 v" F& H7 t6 I) i1 a9 l 在网上浏览后,我似乎回答了自己的问题:' m' h. k% z4 Y9 b' ` m
SELECT grandparent.gname.value('@name','VARCHAR(15)parent.pname.value('@name','VARCHAR(15)child.cname.value('@name','VARCHAR(15)')FROM @xmlFamilyTree.nodes('/grandparent') AS grandparent(gname)CROSS APPLY grandparent.gname.nodes('*') AS parent(pname)CROSS APPLY parent.pname.nodes('children/*') AS child(cname)使用CROSS APPLYI可选顶级grandparent然后用它来选择子parent节点,以此类推。使用这种方法,我的查询大是从 f7 b7 G' z6 l' h5 Q, X1分钟30秒的 执行 时间 减少到 6秒 。% \4 v: `' m" w) E9 h( m! W D
但有趣的是,如果我用旧OPEN XML如果该方法检索相同的数据,则将在 1秒内 执行! + K+ g3 Q, l4 P似乎你必须根据文档的预期大小/复杂性逐案处理这两种技术。