如何使用 SQL .nodes 和 .exist

How to use SQL .nodes AND .exist

我之前问过一个问题,但没有得到任何回复。这是再试一次,让它更简单。对于我的一生,我无法弄清楚如何按照我需要的方式让它工作。假设我有一些 XML:

<aliases>
  <alias>
    <templateId @root="1" />
    <aliasName>Pramod Singh</aliasName>
  </alias>
  <alias>
    <templateId @root="2" />
    <aliasName>Bijoy Bora</aliasName>
  </alias>
  <alias>
    <templateId @root="1" />
    <aliasName>Testy McTestFace</aliasName>
  </alias>
</aliases>

在上面的示例中,我想要 aliasName 但 如果父别名标记具有根值为 1 的 templateId。所以我的预期结果是:

普拉莫德·辛格

Testy McTestFace

我尝试过使用交叉应用@XML.nodes(/aliases/alias) 但无法在所述节点上使用 .exist。我也尝试过使用 @XML.query 但它没有 return 多个实例。必须有一个简单的方法来完成这个,但我就是想不通。

请记住,这是一个非常简单的 XML,我只是想说明我的问题。我正在检索许多值的实际 XML 个文件,每个文件的大小在 1-3 MB 之间。

谢谢!

请尝试以下操作SQL:

DECLARE @xml XML = N'<aliases>
    <alias>
        <templateId root="1"/>
        <aliasName>Pramod Singh</aliasName>
    </alias>
    <alias>
        <templateId root="2"/>
        <aliasName>Bijoy Bora</aliasName>
    </alias>
    <alias>
        <templateId root="1"/>
        <aliasName>Testy McTestFace</aliasName>
    </alias>
</aliases>';

SELECT c.value('(templateId/@root)[1]','INT') AS ARoot
    , c.value('(aliasName/text())[1]','VARCHAR(30)') AS AliasName
FROM @xml.nodes('/aliases/alias[templateId/@root=("1","2")]') AS t(c);