检查SQL中的XML节点是否为空

时间:2018-04-26 15:42:05

标签: sql xml nodes

您好我是XML操作的新手,我的问题是,如果有可能检测到XML节点是否是这样的空节点:<gen:nodeName />

我能够操作单个节点但是如果有一个类似循环或递归函数的方法可以节省一些时间从而通过每个节点查看手工劳动,我会感兴趣。我不知道如何解决这个问题。

感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

您没有指定SQL的方言([sql]是不够的,请始终指定RDBMS包含版本。)

这适用于SQL-Server,但语义应该相同。

DECLARE @xml XML=
N'<root>
    <SelfClosing />
    <NoContent></NoContent>
    <BlankContent> </BlankContent>
    <HasContent>blah</HasContent>
    <HasContent>other</HasContent>
</root>';

SELECT @xml.query(N'/root/*') AS AnyBelowRoor                  --All elements
      ,@xml.query(N'/root/*[text()]') AS AnyWithTextNode       --blah and other
      ,@xml.query(N'/root/*[not(text())]') AS NoText           --no text
      ,@xml.query(N'/root/*[text()="blah"]') AS AnyWithTextNode--blah only

<SelfClosing />在语义上与<NoContent><NoContent>相同。没有区别。

这可能是一个惊喜,但blank内容也被视为空。

因此检查为空或非空是检查text()节点是否存在。我可以使用not()对此进行否定,以便在没有text()的情况下找到所有内容。

有趣:NoText的结果以(SQL-Server)

的形式返回
<SelfClosing />
<NoContent />
<BlankContent />

这三个元素以最短格式隐式返回。