Xml 获取所有行,即使节点并不总是存在

Xml 获取所有行,即使节点并不总是存在,xml,tsql,cross-apply,Xml,Tsql,Cross Apply,我有数千个xml文件要从中获取数据。 为了实现这一点,我使用了交叉应用方法 但问题是,有些节点并不总是存在于xml文件中。 在我的示例中,这是节点“valueX”(在产品节点内)。这个节点只出现在最后一个人身上。 约翰 abc 100 def 99 玛丽 abc 200 彼得 abc 300 控告 abc 400 测试 如果现在使用“valueX”节点通过交叉应用查询xml文件,则只会得到包含此节点的一条记录 declare@tab表( id int ,xmldataxml ) 声明@xm

我有数千个xml文件要从中获取数据。 为了实现这一点,我使用了交叉应用方法

但问题是,有些节点并不总是存在于xml文件中。 在我的示例中,这是节点“valueX”(在产品节点内)。这个节点只出现在最后一个人身上。


约翰
abc
100
def
99
玛丽
abc
200
彼得
abc
300
控告
abc
400
测试
如果现在使用“valueX”节点通过交叉应用查询xml文件,则只会得到包含此节点的一条记录

declare@tab表(
id int
,xmldataxml
)
声明@xml nvarchar(最大值)
set@xml=
约翰
abc
100
def
99
玛丽
abc
200
彼得
abc
300
控告
abc
400
测试
'
插入@tab(id,xmlData)
价值观(
1.
,@xml
)
选择t.id
,Person.ref.value('name[1]”,'nvarchar(255')作为PersonName
,Product.ref.value('id[1],'nvarchar(3)')作为ProductID
,Product.ref.value('price[1],'int')作为ProductPrice
,ValueX.ref.value('name[1],'nvarchar(255)')作为ValueXName
从@tab作为t
交叉应用t.xmlData.nodes('invoice/person')person(参考)
交叉应用个人参考节点(“产品”)产品(参考)
交叉应用Product.ref.nodes('valueX')valueX(ref)
但即使节点不存在,我也需要所有记录


我怎样才能做到这一点呢?

把你的最后一部分改成

from @tab as t

outer apply t.xmlData.nodes('invoice/person') Person(ref)
    outer apply Person.ref.nodes('product') Product(ref)
        outer apply Product.ref.nodes('valueX') ValueX(ref)   

交叉应用
就像
内部连接
外部应用
就像
左侧连接

非常感谢!真的很快!
from @tab as t

outer apply t.xmlData.nodes('invoice/person') Person(ref)
    outer apply Person.ref.nodes('product') Product(ref)
        outer apply Product.ref.nodes('valueX') ValueX(ref)