在SQL Server中选择XML节点

时间:2017-05-09 14:29:55

标签: sql-server xml

我在SQL服务器表中有XML,数据看起来像这样

DECLARE @XML XML
DECLARE @output XML
SET @XML='<ROOT>
    <HDR>
        <NBR>21</NBR>
        <DT>2009-08-17</DT>
    </HDR>
    <OTHERINFO>
        <RAT>
          <ASMT_DT>2015-08-10</ASMT_DT>
        </RAT>
        <RAT>
          <ASMT_DT>2014-08-10</ASMT_DT>
          <INDICATOR>1</INDICATOR>
        </RAT>
        <RAT>
          <ASMT_DT>2013-08-10</ASMT_DT>
          <INDICATOR>1</INDICATOR>
        </RAT>
    </OTHERINFO>
</ROOT>'

我想打印节点没有 <INDICATOR>1</INDICATOR>的XML,例如

SET @output=
'<ROOT>
    <HDR>
        <NBR>21</NBR>
        <DT>2009-08-17</DT>
    </HDR>
    <OTHERINFO>
        <RAT>
           <ASMT_DT>2015-08-10</ASMT_DT>
        </RAT>
    </OTHERINFO>
</ROOT>'

我该怎么做? 感谢

1 个答案:

答案 0 :(得分:2)

您可以使用.modify()删除您不想保留的所有节点:

SET @XML='<ROOT>
    <HDR>
        <NBR>21</NBR>
        <DT>2009-08-17</DT>
    </HDR>
    <OTHERINFO>
        <RAT>
          <ASMT_DT>2015-08-10</ASMT_DT>
        </RAT>
        <RAT>
          <ASMT_DT>2014-08-10</ASMT_DT>
          <INDICATOR>1</INDICATOR>
        </RAT>
        <RAT>
          <ASMT_DT>2013-08-10</ASMT_DT>
          <INDICATOR>1</INDICATOR>
        </RAT>
    </OTHERINFO>
</ROOT>';

SET @XML.modify('delete /ROOT/OTHERINFO/RAT[INDICATOR=1]');
SELECT @XML;

另一个 - 内联! - 方法是FLWOR XQuery

SELECT @XML.query
('  let $hdr:=/ROOT/HDR
    let $oi:=/ROOT/OTHERINFO
    return
    <ROOT>
    {$hdr}
    <OTHERINFO>
    {
        for $r in $oi/RAT[empty(INDICATOR) or INDICATOR/text()!="1"]
        return $r
    }
    </OTHERINFO>
    </ROOT>
');