OpemXML - 读取SQL中的最后一个节点

时间:2017-04-27 03:56:40

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

我有这样的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>          

我正在使用Query来读取节点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”

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

谢谢

3 个答案:

答案 0 :(得分:0)

您应该将value()last()用于xml类型,而不是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

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

FROM OPENXML与相应的SP准备和删除文档已经过时,不应再使用(很少有例外)。而是使用适当的methods the XML data type provides

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

在你写的问题中,你要读取最后一个节点,即#34; DAY&#34;和&#34; 20170411110900&#34;
你的标准是什么? 最后 <Pat>="DAY" 或 - 如果可能更多相同 - 最后一个<PATCat><Pat>="DAY" ?元素总是以相同的顺序排列吗?最后一个<PATCat>始终是<PAT>="DAY"吗?

您已经获得了last()的解决方案。它会找到最后的<PATCat>,无论内在的是什么:

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

寻找与#34; DAY&#34;会是这个

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

如果有更多&#34; DAY&#34;您可以使用[1]

替换上一个[last()]