【问题标题】:How to use SQL .nodes AND .exist如何使用 SQL .nodes 和 .exist
【发布时间】:2020-11-17 02:35:18
【问题描述】:

我问了一个之前的问题,但没有得到任何答复。这是再次尝试并使其更简单。对于我的生活,我无法弄清楚如何以我需要的方式让它工作。假设我有一些 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 但 仅 如果父别名标记的 templateId 的根值为 1。所以我的预期结果是:

普拉莫德·辛格

暴躁的麦克TestFace

我尝试过使用 cross apply @XML.nodes(/aliases/alias) 但不能在所述节点上使用 .exist。我也尝试过使用@XML.query,但它不返回多个实例。必须有一种简单的方法来实现这一点,但我就是想不通。

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

谢谢!

【问题讨论】:

    标签: sql xml sql-server-2008


    【解决方案1】:

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

    【讨论】:

    • 我将这个逻辑应用到我的实际用例中并且它起作用了。另外,我将如何获取值为 1 或 2 的 @root?
    • 对不起,我应该更具体。我的意思是在这部分:FROM @xml.nodes('/aliases/alias[templateId/@root="1"]') AS t(c); 是否有可能有@root IN ("1","2") 或类似的?谢谢
    • 非常感谢。我为此苦苦挣扎的时间比我愿意承认的要长。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-02-15
    • 1970-01-01
    • 1970-01-01
    • 2013-11-22
    • 1970-01-01
    • 1970-01-01
    • 2017-03-02
    相关资源
    最近更新 更多