【问题标题】:OpemXML - Read last node in SQLOpenXML - 读取 SQL 中的最后一个节点
【发布时间】:2017-09-24 16:40:02
【问题描述】:

我有一个这样的 XML

<Cat>
    <Inner>
        <PATCat>
            <Pat>SUR</Pat>
            <EfDa>20170411093000</EfDa>
        </PATCat>
        <PATCat>
            <Pat>MH</Pat>
            <EfDa>20170411094100</EfDa>
        </PATCat>
        <PATCat>
            <Pat>NRO</Pat>
            <EfDa>20170411095300</EfDa>
        </PATCat>
        <PATCat>
            <Pat>DAY</Pat>
            <EfDa>20170411110900</EfDa>
        </PATCat>
    </Inner>
</Cat>          

我正在使用查询来读取节点 Pat 和 EfDa

SELECT      @PATCat_Pat = Pat,      
                    @PATCat_EfDa = EfDa,        

        FROM    OPENXML(@idoc, '/Cat/Inner', 2)
        WITH    (
            FiCl VARCHAR(20) 'PATCat/Pat',
            EfDa VARCHAR(20) 'PATCat/EfDa', 
            )

结果是@PATCat_Pat = SUR 和@PATCat_EfDa = 20170411093000,而我想读取最后一个节点“DAY”和“20170411110900”

我怎样才能做到这一点?任何帮助将不胜感激

谢谢

【问题讨论】:

  • 可以加last():FiCl VARCHAR(20) 'PATCat[last()]/Pat',吗?

标签: sql sql-server xml openxml sql-server-openxml


【解决方案1】:

xml 类型应该使用value()last() 而不是OPENXML

DECLARE @xml XML = N'<Cat>
   <Inner>
      <PATCat>
         <Pat>SUR</Pat>
         <EfDa>20170411093000</EfDa>
      </PATCat>
      <PATCat>
         <Pat>MH</Pat>
         <EfDa>20170411094100</EfDa>
      </PATCat>
      <PATCat>
         <Pat>NRO</Pat>
         <EfDa>20170411095300</EfDa>
      </PATCat>
      <PATCat>
         <Pat>DAY</Pat>
         <EfDa>20170411110900</EfDa>
      </PATCat>
   </Inner>
</Cat>'

SELECT @xml.value('(Cat/Inner/PATCat[last()]/Pat)[1]', 'varchar(10)') AS PAT,
   @xml.value('(Cat/Inner/PATCat[last()]/EfDa)[1]', 'varchar(30)') AS EfDa

返回

PAT     EfDa <br/>
DAY     20170411110900

【讨论】:

  • 谢谢 TriV,问题是我在函数中没有实际的 xml,我只有 xml 的句柄,谢谢
【解决方案2】:

last() 也可以与 OPENXML 一起使用。

SELECT Pat,      
       EfDa        
FROM OPENXML(@idoc, '/Cat/Inner/PATCat[last()]', 2)
WITH (
     Pat VARCHAR(20) 'Pat',
     EfDa VARCHAR(20) 'EfDa'
     );

【讨论】:

    【解决方案3】:

    FROM OPENXML 与相应的 SP 准备和删除文档已过时,不应再使用(存在罕见的例外情况)。而是使用适当的methods the XML data type provides

    从我得到的评论中,你的函数得到了句柄,所以你必须坚持这个......

    在您写的问题中,您想读取最后一个节点,即“DAY”和“20170411110900”
    你的标准是什么? last&lt;Pat&gt;="DAY" 或 - 如果可能有更多相同 - 最后一个 &lt;PATCat&gt;,它有 &lt;Pat&gt;="DAY"?元素总是按相同的顺序排列吗?最后一个&lt;PATCat&gt; 总是带有&lt;PAT&gt;="DAY" 的那个吗?

    您已经有了last() 的解决方案。不管里面是什么,它都会找到最后一个&lt;PATCat&gt;

    '/Cat/Inner/PATCat[last()]'
    

    寻找带有“DAY”的就是这个

    '/Cat/Inner/PATCat[(PAT/text())[1]="DAY"][1]'
    

    如果“DAY”可能有更多内容,您可以将最后一个 [1] 替换为 [last()]

    【讨论】:

      猜你喜欢
      • 2012-12-22
      • 2019-07-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-30
      • 1970-01-01
      相关资源
      最近更新 更多