如何使用sql.nodes和.exist

whhtz7ly  于 2021-07-29  发布在  Java
关注(0)|答案(1)|浏览(322)

我问了之前的问题,但没有得到任何答复。这是为了再试一次,使它更简单。就我的一生而言,我不知道如何让它按我需要的方式工作。假设我有一些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,但前提是父alias标记的templateid的根值为1。所以我的预期结果是:
普拉莫德辛格
易怒的mctestface
我尝试过使用cross-apply@xml.nodes(/aliases/alias),但无法在所述节点上使用.exist。我也尝试过使用@xml.query,但它不会返回多个示例。必须有一个简单的方法来实现这一点,但我就是想不出来。
请记住,这是一个极其简化的xml,我只是想说明我的问题。我的实际xml文件我正在检索许多值,每个文件的大小在1-3 mb之间。
谢谢您!

z4iuyo4d

z4iuyo4d1#

请尝试以下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);

相关问题