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

bet*_*eta 1 xml t-sql sql-server exists xml-namespaces

我想编写将XML exists()函数与命名空间和IF-ELSE构造结合使用的T-SQL代码。

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

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

IF ((@MyXML.exist('someNode')) = 0)
BEGIN
    -- Do Something
END
ELSE
BEGIN
    -- Do Something else
END
Run Code Online (Sandbox Code Playgroud)

但是,如果需要使用名称空间,我不知道如何结合使用。我尝试如下,但收到错误。

;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
Run Code Online (Sandbox Code Playgroud)

我收到以下错误:

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

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

Shn*_*ugo 5

您已经有了Jeroen的一种解决方案(链接到文档)。但是-只是为了好玩-我想告诉你,有几种方法可以去:

DECLARE @xml XML=
N'<root xmlns:ns="dummy">
    <ns:test>1</ns:test>
  </root>';
Run Code Online (Sandbox Code Playgroud)

--wildcard用于命名空间

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

--inline声明(如文档中所述)

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

-您可以使用以上所有设置变量

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

-并且-如果需要的话-您仍然可以像此处使用WITHXMLNAMESPACES来设置变量

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';
Run Code Online (Sandbox Code Playgroud)

总的来说,这有点程序上的问题。也许,完全有更好的方法...