具有不同名称的节点的 TSQL XPath

TSQL XPath for nodes with different names

在 SQL Server 2008 中(是的,我知道)您如何编写 XPath 来查找具有不同名称的节点?[​​=14=]

例如,如果我有以下任一项 XML...

DECLARE @XML XML = '<data><id>1</id><id>2</id></data>'
or...
DECLARE @XML XML = '<d><i>1</i><i>2</i></d>'

我可以编写以下内容,它适用于第一个 XML,但不适用于第二个 XML。

SELECT X.value('.','int') FROM @XML.nodes('/data/id') AS X(X)

我打算使用联合 (/data/id | /d/i) 但 SQL 服务器显然不支持联合。

简单的解决方案是执行以下操作...

SELECT X.value('.','int') FROM @XML.nodes('/data/id') AS X(X)
UNION
SELECT X.value('.','int') FROM @XML.nodes('/d/i') AS X(X)

...但如果只有一个 XPath 解决方案,我会更喜欢它

我刚刚找到了 this answer(它适用于一般的 XPath,而不是基于 SQL)并且它给了我解决方案。

使用 , 字符并括在括号中...

SELECT X.value('text()[1]','int') FROM @XML.nodes('(/data/id,/d/i)') AS X(X)

(注意,我还根据@YitzhakKhabinsky 的建议将 '.' 更新为 'text()[1]'