回答

收藏

使用nodes()方法展平SQL中的分层XML

技术问答 技术问答 246 人阅读 | 0 人回复 | 2023-09-14

我有一个存储过程,它将存储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似乎你必须根据文档的预期大小/复杂性逐案处理这两种技术。
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则