如何從 XML 資料中提取屬性的值?
drop table #demo2
create table #demo2 (field1 xml)
insert into #demo2 (field1)
values (
'<root xmlns="system/schema" vesion="1.0">
<header msgtype="1">
<msgid>1</msgid>
</header>
<transaction>
<systemevent>
<eventdetail eventtype="100">
<eventstamp unitid="87888" value="2021-11-14T01:44:41.069Z" />
<eventitem id="1" value="abc123" />
</eventdetail>
<eventdetail eventtype="102">
<eventstamp unitid="87889" value="2021-11-14T01:44:41.704Z" />
<eventitem id="2" />
</eventdetail>
</systemevent>
</transaction>
</root>')
我期待這個 XML的答案是abc123& null。以下是我試圖獲得預期值的查詢。
select x.v.value('@value','VARCHAR(100)') AS EventValue,
y.v.value('@value','VARCHAR(100)') AS EventValue2
from #demo2 t
cross apply field1.nodes('//eventdetail[@eventtype="100"]/eventitem') x(v)
cross apply field1.nodes('//eventdetail[@eventtype="102"]/eventitem') y(v)
我不確定我缺少什么xpath才能獲得價值。謝謝你的幫助。
uj5u.com熱心網友回復:
這個:
<root xmlns="system/schema" vesion="1.0">
意味著檔案有一個默認的命名空間,所以所有的元素實際上都在命名空間中。該檔案與此檔案等效:
<foo:root xmlns:foo="system/schema" vesion="1.0">
<foo:header msgtype="1">
<foo:msgid>1</foo:msgid>
</foo:header>
<foo:transaction>
<foo:systemevent>
<foo:eventdetail eventtype="100">
<foo:eventstamp unitid="87888" value="2021-11-14T01:44:41.069Z" />
<foo:eventitem id="1" value="abc123" />
</foo:eventdetail>
<foo:eventdetail eventtype="102">
<foo:eventstamp unitid="87889" value="2021-11-14T01:44:41.704Z" />
<foo:eventitem id="2" />
</foo:eventdetail>
</foo:systemevent>
</foo:transaction>
</foo:root>
所以你必須使用WITH XMLNAMESPACES 對你的查詢進行命名空間限定,例如
WITH XMLNAMESPACES (DEFAULT 'system/schema')
select x.v.value('@value','VARCHAR(100)') AS EventValue,
y.v.value('@value','VARCHAR(100)') AS EventValue2
from #demo2 t
cross apply field1.nodes('//eventdetail[@eventtype="100"]/eventitem') x(v)
cross apply field1.nodes('//eventdetail[@eventtype="102"]/eventitem') y(v)
并且您還應該完全限定元素 XPath 而不是//在大多數情況下使用。例如
WITH XMLNAMESPACES (DEFAULT 'system/schema')
select x.v.value('@value','VARCHAR(100)') AS EventValue,
y.v.value('@value','VARCHAR(100)') AS EventValue2
from #demo2 t
cross apply field1.nodes('/root/transaction/systemevent/eventdetail[@eventtype="100"]/eventitem') x(v)
cross apply field1.nodes('/root/transaction/systemevent/eventdetail[@eventtype="102"]/eventitem') y(v)
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/361950.html
標籤:sql-server 查询语句
上一篇:查詢中的TSQL順序/序列組
