【问题标题】:TSQL XML exists query with namespaces and IF-ELSE conditionTSQL XML 存在带有命名空间和 IF-ELSE 条件的查询
【发布时间】:2019-04-27 23:12:27
【问题描述】:

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

this thread我知道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-SQL If-Else 构造与 XML 命名空间和 XML exist() 函数结合使用?

【问题讨论】:

  • 感谢工作。而且我了解到命名空间是区分大小写的。
  • XML / XPath / XQuery 中的所有内容都区分大小写... :-)

标签: sql-server xml tsql xml-namespaces exists


【解决方案1】:

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';

--inline 声明(在文档中告诉你)

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';

总而言之,这有点程序性...可能是,完全有更好的方法...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-02-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-24
    • 1970-01-01
    • 1970-01-01
    • 2021-12-18
    相关资源
    最近更新 更多