TSQLXML存在具有名称空间和IF-ELSE条件的查询



我想编写T-SQL代码,将XMLexists()函数与名称空间和IF-ELSE构造的使用结合起来。

从这个线程中,我知道WITH XMLNAMESPACES用于使用名称空间。我还知道exist()函数用于确定XML变量中是否存在节点。

到目前为止,我使用exist()如下:

IF ((@MyXML.exist('someNode')) = 0)
BEGIN
-- Do Something
END
ELSE
BEGIN
-- Do Something else
END

但是,如果需要使用名称空间,我不知道如何将其结合起来。我按如下方式尝试,但出现了错误。

;WITH XMLNAMESPACES('http://www.sdmx.org/resources/sdmxml/schemas/v2_1/message' AS ns)
IF ((@MyXML.exist('ns:someNode')) = 0)
BEGIN
-- Do Something
END
ELSE
BEGIN
-- Do Something else
END

我得到以下错误:

关键字"WITH"附近的语法不正确。

因此,我的问题是:如何将T-SQLIf-Else构造与XML命名空间和XMLexist()函数结合使用?

Jeroen已经提供了一个解决方案(链接到文档(。但是——只是为了好玩——我想向你展示,有几种方法可以走:

DECLARE @xml XML=
N'<root xmlns:ns="dummy">
<ns:test>1</ns:test>
</root>';

--命名空间的通配符

IF @xml.exist('//*:test[text()=1]')=1
PRINT 'test 1-yes'
ELSE
PRINT 'test 1-no';

--内联声明(如文档中所述(

IF @xml.exist('declare namespace ns="dummy";//ns:test[text()=1]')=1
PRINT 'test 2-yes'
ELSE
PRINT 'test 2-no';

--您可以使用以上所有内容来设置可变

DECLARE @check BIT = @xml.exist('//*:test[text()=1]');

--如果需要,您仍然可以像这里一样使用WITHXMLNAMESPACE来设置变量

WITH XMLNAMESPACES('dummy' AS ns)
SELECT @check=@xml.exist('//ns:test[text()=1]');
IF @check=1
PRINT 'test 4-yes'
ELSE
PRINT 'test 4-no';

总的来说,这闻起来有点程序性。。。也许,有一个更好的方法完全。。。

最新更新