0

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

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

谢谢

4

3 回答 3

0

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

SELECT Pat,      
       EfDa        
FROM OPENXML(@idoc, '/Cat/Inner/PATCat[last()]', 2)
WITH (
     Pat VARCHAR(20) 'Pat',
     EfDa VARCHAR(20) 'EfDa'
     );
于 2017-04-27T06:26:30.013 回答
0

您应该对 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
于 2017-04-27T04:19:17.553 回答
0

FROM OPENXML使用相应的 SP 准备和删除文档已过时,不应再使用(存在极少数例外)。而是使用XML 数据类型提供的适当方法

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

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

你已经有了解决方案last()<PATCat>无论里面有什么,它都会找到最后一个:

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

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

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

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

于 2017-04-27T07:10:00.077 回答