T-SQL中的sqlxml解析

T-SQL中的sqlxml解析,sql,sql-server,sql-server-2012,sqlxml,Sql,Sql Server,Sql Server 2012,Sqlxml,我有一个SQL Server表,其中包含XML列,该列包含如下数据。表中将有多条记录。 让我们说一下表T1和列C1 我们的要求是,我们需要通过最大的datereported、datecreated、dateupdated XML节点获取各个部分(如AAA、BB、CC)的最新数据 <XMLDoc> <AAA> <Name>Name_A</Name> <Value>Val_A</Value>

我有一个SQL Server表,其中包含XML列,该列包含如下数据。表中将有多条记录。 让我们说一下表T1和列C1

我们的要求是,我们需要通过最大的datereported、datecreated、dateupdated XML节点获取各个部分(如AAA、BB、CC)的最新数据

<XMLDoc>
    <AAA>
      <Name>Name_A</Name>
      <Value>Val_A</Value>
      <dateReported>1/1/2001</dateReported>
    </AAA>
    <AAA>
      <Name>Name_B</Name>
      <Value>Val_B</Value>
      <dateReported>1/1/2014</dateReported>
    </AAA>
    <AAA>
      <Name>Name_C</Name>
      <Value>Val_C</Value>
      <dateReported>1/1/2012</dateReported>
    </AAA>
    <AAA>
      <Name>Name_D</Name>
      <Value>Val_D</Value>
      <dateReported>1/1/2011</dateReported>
    </AAA>
    <BB>
        <ID>112</ID>
        <dateCreated>1/1/2011</dateCreated>

    </BB>
        <BB>
        <ID>121</ID>
        <dateCreated>1/1/2012</dateCreated>
    </BB>
    <BB>
        <ID>12</ID>
        <dateCreated>1/1/2015</dateCreated>
    </BB>
    <CC>
        <Type>XML</Type>
        <dateUpdated>1/1/2015</dateCreated>
    </CC>
     <CC>
        <Type>TXT</Type>
        <dateUpdated>3/3/2015</dateUpdated>
    </CC>
     <CC>
        <Type>XLS</Type>
        <dateUpdated>2/2/2015</dateUpdated>
    </CC>
</XMLDoc>
我们需要的是产出

Id Name, Value, BB_ID, CC_Type
1  Name_B Val_B  12    TXT

需要你的输入

你的XML样本是非常错误的-很多关闭标签不是真正的关闭标签,一些不匹配开放标签,并且中间有一个没有任何打开标签……下次,请尝试确保您发布的内容实际上是有效的XML

请尝试使用以下代码:

DECLARE @T1 TABLE (ID INT NOT NULL, XmlContent XML)

INSERT INTO @T1 VALUES(1, '<XMLDoc>
    <AAA>
      <Name>Name_A</Name>
      <Value>Val_A</Value>
      <dateReported>1/1/2001</dateReported>
    </AAA>
    <AAA>
      <Name>Name_B</Name>
      <Value>Val_B</Value>
      <dateReported>1/1/2014</dateReported>
    </AAA>
    <AAA>
      <Name>Name_C</Name>
      <Value>Val_C</Value>
      <dateReported>1/1/2012</dateReported>
    </AAA>
    <AAA>
      <Name>Name_D</Name>
      <Value>Val_D</Value>
      <dateReported>1/1/2011</dateReported>
    </AAA>
    <BB>
        <ID>112</ID>
        <dateCreated>1/1/2011</dateCreated>
    </BB>
    <BB>
        <ID>121</ID>
        <dateCreated>1/1/2012</dateCreated>
    </BB>
    <BB>
        <ID>12</ID>
        <dateCreated>1/1/2015</dateCreated>
    </BB>
    <CC>
        <Type>XML</Type>
        <dateUpdated>1/1/2015</dateUpdated>
    </CC>
     <CC>
        <Type>TXT</Type>
        <dateUpdated>3/3/2015</dateUpdated>
    </CC>
     <CC>
        <Type>XLS</Type>
        <dateUpdated>2/2/2015</dateUpdated>
    </CC>
</XMLDoc>')

;WITH XmlData AS
(
    SELECT 
        ID,
        NodeType = 'AAA',
        RelevantDate = XC.value('(dateReported)[1]', 'datetime'),
        Name = XC.value('(Name)[1]', 'varchar(50)'),
        Value = XC.value('(Value)[1]', 'varchar(50)')
    FROM 
        @T1
    CROSS APPLY
        XmlContent.nodes('/XMLDoc/AAA') XT(XC)

    UNION

    SELECT 
        ID,
        NodeType = 'BB',
        RelevantDate = XC.value('(dateCreated)[1]', 'datetime'),
        Name = null,
        Value = XC.value('(ID)[1]', 'varchar(50)')
    FROM 
        @T1
    CROSS APPLY
        XmlContent.nodes('/XMLDoc/BB') XT(XC)

    UNION

    SELECT 
        ID,
        NodeType = 'CC',
        RelevantDate = XC.value('(dateUpdated)[1]', 'datetime'),
        Name = XC.value('(Type)[1]', 'varchar(50)'),
        Value = null
    FROM 
        @T1
    CROSS APPLY
        XmlContent.nodes('/XMLDoc/CC') XT(XC)
)
SELECT 
    xd.ID,
    Name = MAX(Name),
    Value = MAX(Value),
    BB_ID = MAX(BB_ID),
    CC_Type = MAX(CC_Type)
FROM 
    XmlData xd
WHERE
    xd.RelevantDate = (SELECT MAX(xd1.RelevantDate) FROM XmlData xd1 WHERE xd1.NodeType = xd.NodeType)
GROUP BY
    xd.ID
这为我提供了以下输出:


基本上,以您的XML为例,我正在创建一个CTE公共表表达式,用于提取每个节点类型的相关信息—节点、节点和节点。然后,通过从该CTE中选择,我可以获得每个组的最大日期。

我在互联网上搜索并找到处理最大日期的好方法:

这是我使用的表: 创建表xmlTable ID INT,xmlData XML

选择:

SELECT 
    ID
    , xmlData.value ('(/XMLDoc/AAA[not(/XMLDoc/AAA/dateReported > dateReported)]/Name)[1]', 'varchar(100)') AS Name
    , xmlData.value ('(/XMLDoc/AAA[not(/XMLDoc/AAA/dateReported > dateReported)]/Value)[1]', 'varchar(100)') AS Value
    , xmlData.value ('(/XMLDoc/BB[not(/XMLDoc/BB/dateCreated > dateCreated)]/ID)[1]', 'INT') AS BB_ID
    , xmlData.value ('(/XMLDoc/CC[not(/XMLDoc/CC/dateUpdated > dateUpdated)]/Type)[1]', 'varchar(50)') AS CC_Type
FROM #xmlTable AS xt
最后的结果是:

ID  Name    Value   BB_ID   CC_Type  
1   Name_B  Val_B   121     TXT

我在本例中找到的解决方案

下次道歉会解决的。您的输出不匹配。。我需要最大日期值的数据节点,而查询只提供最大日期值谢谢,但此查询提供3行,我希望输出为单行Id名称、值、BB_Id、CC_类型1名称\u B值\u B 12TXT@Saravanan:再次更新我的回复-现在是否符合您的需要?
ID  Name    Value   BB_ID   CC_Type  
1   Name_B  Val_B   121     TXT