TSQL XML 存在带有命名空间和 IF-ELSE 条件的查询
TSQL XML exists query with namespaces and IF-ELSE condition
我想编写 T-SQL 代码,将 XML exists()
函数与命名空间和 IF-ELSE
结构的使用结合起来。
从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
我收到以下错误:
Incorrect syntax near the keyword 'WITH'.
因此,我的问题是:如何将 T-SQL If-Else
构造与 XML 命名空间和 XML exist()
结合使用功能?
你已经得到了 Jeroen 的一个解决方案(link 到文档)。但是 - 只是为了好玩 - 我想告诉你,有几种方法可以去:
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';
总的来说这有点程序性...可能是,完全有更好的方法...
我想编写 T-SQL 代码,将 XML exists()
函数与命名空间和 IF-ELSE
结构的使用结合起来。
从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
我收到以下错误:
Incorrect syntax near the keyword 'WITH'.
因此,我的问题是:如何将 T-SQL If-Else
构造与 XML 命名空间和 XML exist()
结合使用功能?
你已经得到了 Jeroen 的一个解决方案(link 到文档)。但是 - 只是为了好玩 - 我想告诉你,有几种方法可以去:
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';
总的来说这有点程序性...可能是,完全有更好的方法...