[英]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.