簡體   English   中英

OpemXML-讀取SQL中的最后一個節點

[英]OpemXML - Read last node in SQL

我有這樣的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”

我該如何實現? 任何幫助,將不勝感激

謝謝

您應將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

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

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

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”還有更多,則可以用[last()]替換最后一個[1] [last()]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM