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

Sql server TSQL XML存在具有名称空间和IF-ELSE条件的查询,sql-server,xml,tsql,xml-namespaces,exists,Sql Server,Xml,Tsql,Xml Namespaces,Exists,我想编写T-SQL代码,将XMLexists()函数的使用与名称空间和IF-ELSE构造结合起来 据我所知,使用xmlnamespace的用于使用名称空间。我还知道exist()函数用于确定XML变量中是否存在节点 到目前为止,我使用的exist()如下: IF ((@MyXML.exist('someNode')) = 0) BEGIN -- Do Something END ELSE BEGIN -- Do Something else END 但是,如果我需要使用名称空间

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

据我所知,使用xmlnamespace的
用于使用名称空间。我还知道
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-SQL
If-Else
构造与XML名称空间和XML
exist()
函数结合使用?

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

DECLARE @xml XML=
N'<root xmlns:ns="dummy">
    <ns:test>1</ns:test>
  </root>';
--内联声明(如文档中所述)

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

DECLARE @check BIT = @xml.exist('//*:test[text()=1]');
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';
--如果需要的话,您仍然可以像这里一样使用WITHXMLNAMESPACES来设置变量

DECLARE @check BIT = @xml.exist('//*:test[text()=1]');
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';

总之,这闻起来有点程序性。。。可能是,有一个更好的方法……你已经有了Jeroen的一个解决方案(链接到文档)。但是-只是为了好玩-我想告诉你,有几种方法可以走:

DECLARE @xml XML=
N'<root xmlns:ns="dummy">
    <ns:test>1</ns:test>
  </root>';
--内联声明(如文档中所述)

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

DECLARE @check BIT = @xml.exist('//*:test[text()=1]');
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';
--如果需要的话,您仍然可以像这里一样使用WITHXMLNAMESPACES来设置变量

DECLARE @check BIT = @xml.exist('//*:test[text()=1]');
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';

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

。谢谢你的帮助。我还了解到名称空间是区分大小写的。XML/XPath/XQuery中的所有内容都是区分大小写的…:-)。谢谢,这很有效。我还了解到名称空间是区分大小写的。XML/XPath/XQuery中的所有内容都是区分大小写的…:-)