代码之家  ›  专栏  ›  技术社区  ›  beta

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

  •  1
  • beta  · 技术社区  · 6 年前

    我想编写结合使用XML的T-SQL代码 exists() 具有名称空间和 IF-ELSE

    this thread 我知道 WITH XMLNAMESPACES 用于使用名称空间。我也知道 exist() 函数用于确定XML变量中是否存在节点。

    直到现在,我用 存在() 详情如下:

    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
    

    我得到以下错误:

    因此,我的问题是:如何使用T-SQL If-Else 结合XML名称空间和XML 存在()

    1 回复  |  直到 6 年前
        1
  •  5
  •   Gottfried Lesigang    6 年前

    你已经有了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]');
    

    --如果需要的话,您仍然可以像这里一样使用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';
    

    总的来说,这有点臭 程序性