我有一個 XML 我試圖決議到表。我用相似但不同的 XML 管理了這個。
它看起來像這樣:
<del:DeliverMeterReading xmlns:del="http://schemas.fortum.com/amm/delivermeterreading">
<del:Header>
<del:MessageId> X </del:MessageId>
<del:MessageType> Y </del:MessageType>
<del:MessageCreatedTimestamp>2021-10-27T22:10:25.362 00:00</del:MessageCreatedTimestamp>
<del:MessageReceivedTimestamp>2021-10-27T22:10:31 00:00</del:MessageReceivedTimestamp>
<del:DispatchId> Z </del:DispatchId>
</del:Header>
<del:DataRows>
<del:Data>
<del:TaskTypeId>0</del:TaskTypeId>
<del:TaskId>1</del:TaskId>
<del:DeliverySiteEANCode> M </del:DeliverySiteEANCode>
<del:SvkCode>901</del:SvkCode>
<del:MeterId> 999999999 </del:MeterId>
<del:DeliveryFormat>E</del:DeliveryFormat>
<del:ReadingStartDate>2021-08-28T00:00:00.000 00:00</del:ReadingStartDate>
<del:ReadingEndDate>2021-08-28T23:00:00.000 00:00</del:ReadingEndDate>
<del:Resolution>PT1H</del:Resolution>
<del:SpSla />
<del:RecordPosition>1</del:RecordPosition>
<del:Values>
<del:Value position="1" registrationDate="2021-10-27T22:01:51.000 00:00" readingDate="2021-08-28T00:00:00.000 00:00" requestedReadingDate="2021-08-28T00:00:00.000 00:00" reading="96542.26" status="51" meterReadingId="1459846141" />
<del:Value position="2" registrationDate="2021-10-27T22:01:51.000 00:00" readingDate="2021-08-28T01:00:00.000 00:00" requestedReadingDate="2021-08-28T01:00:00.000 00:00" reading="96542.54" status="51" meterReadingId="1459846142" />
</del:Values>
</del:Data>
</del:DataRows>
</del:DeliverMeterReading>
我試圖訪問值的代碼是:
WITH XMLNAMESPACES(N'http://schemas.fortum.com/amm/delivermeterreading' AS del)
SELECT
t.file_name, t.file_created_time received_timestamp,
h.value(N'(/del:MessageId)[1]','varchar(40)')
FROM
load.t t
OUTER APPLY
t.xml_data.nodes('/del:DeliverMeterReading/del:Header') AS m(h)
作為 t = 帶有 xml_data 列的表。我嘗試了一些選擇的變體,但無法弄清楚為什么它顯示為空。我在外部應用路徑和值提取選擇中都包含命名空間。
運行 SQL Server 2019。
有一個類似的問題XML 節點值,其中 xml 資料具有冒號語法,由 marc_s 回答,我使用了它,但只是調整以嘗試獲取標簽括號之間與標簽內的值(@ 用于標簽內的值)。
uj5u.com熱心網友回復:
最小的錯字-在.value(),千萬不包括“/”開頭:
WITH XMLNAMESPACES(N'http://schemas.fortum.com/amm/delivermeterreading' AS del)
SELECT
t.file_name, t.file_created_time received_timestamp,
h.value(N'(del:MessageId)[1]', 'varchar(40)')
FROM
load.t t
OUTER APPLY
t.xml_data.nodes('/del:DeliverMeterReading/del:Header') AS m(h)
uj5u.com熱心網友回復:
你有一個額外的/提到。
使用DEFAULT命名空間可能更容易
WITH XMLNAMESPACES(DEFAULT N'http://schemas.fortum.com/amm/delivermeterreading')
SELECT
t.file_name, t.file_created_time received_timestamp,
h.value(N'(MessageId/text())[1]', 'varchar(40)')
FROM
load.t t
OUTER APPLY
t.xml_data.nodes('/DeliverMeterReading/Header') AS m(h)
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/341121.html
標籤:sql-server 查询
