我试图弄清楚如何在单个查询中获取所有属性。有什么建议吗?
尝试过交叉应用,但我真的不知道如何使用它。
<row id="VILLAFUERTE*MARNY*19740619*SALVACION*DIONGSON" xml:space="preserve">
<c1>20181217</c1>
<c2>CUSTOMER</c2>
<c3>4112694</c3>
<c3 m="2">4078976</c3>
</row>
我希望获得<c3>
的初始值及其属性<c3 m>
。
这是我的表格查询示例
SELECT * FROM FBNK_EB_DUPLICATE where XMLRECORD.value('(/row/c3)[1]','NVARCHAR(100)') = '4112694'
答案 0 :(得分:0)
首先:名称编号元素(<c1/><c2/>
)是一个非常不好的习惯。如果您需要这样的索引,最好使用<c id="1"/><c id="2"/>
。我不知道您的真实世界 XML是否与上面的一样,并且我不知道这是否在您的控制之下,但是如果您可以更改它,那将是个好主意。 ..
现在是您的实际问题。在您的示例中,<c1>
和<c2>
的值仅出现一次,而<c3>
有两次出现。这就是为什么我直接从XML中选择前两个,而最后一个是从派生表(APPLY YourXml.nodes(...)
)中提取的原因。
DECLARE @mockup TABLE(ID INT IDENTITY, YourXml XML);
INSERT INTO @mockup VALUES
(N'<row id="VILLAFUERTE*MARNY*19740619*SALVACION*DIONGSON" xml:space="preserve">
<c1>20181217</c1>
<c2>CUSTOMER</c2>
<c3>4112694</c3>
<c3 m="2">4078976</c3>
</row>');
SELECT YourXml.value('(/row/@id)[1]','nvarchar(max)') AS id
,YourXml.value('(/row/c1/text())[1]','nvarchar(max)') AS c1
,YourXml.value('(/row/c2/text())[1]','nvarchar(max)') AS c2
,c3.value('@m','int') AS c3_m
,c3.value('text()[1]','nvarchar(max)') AS c3_text
FROM @mockup
OUTER APPLY YourXml.nodes('/row/c3') A(c3);
结果
id c1 c2 c3_m c3_text
VILLAFUERTE*MARNY*19740619*SALVACION*DIONGSON 20181217 CUSTOMER NULL 4112694
VILLAFUERTE*MARNY*19740619*SALVACION*DIONGSON 20181217 CUSTOMER 2 4078976