在单个查询中获取所有XML属性

时间:2018-12-21 06:58:46

标签: sql-server xml

我试图弄清楚如何在单个查询中获取所有属性。有什么建议吗?

尝试过交叉应用,但我真的不知道如何使用它。

<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'

1 个答案:

答案 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