我有这样的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”
我怎样才能做到这一点?任何帮助将不胜感激
谢谢
答案 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()]