我在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>'
我该怎么做? 感谢
答案 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>
');