我在表中有一個 XML 列,我試圖將其決議為平面表結構中的值。
我試圖在此處輸入 XML,但 stackoverflow 將其視為代碼,當我嘗試將其格式化為代碼時,它仍然不接受它。
我什至無法從“標題”級別獲取資料。
<RequestMessage xmlns="http://iec.ch/TC57/2011/schema/message" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="Message.xsd">
<Header>
<Verb>created</Verb>
<Noun>MeterReadings</Noun>
<Timestamp>2021-03-08T00:57:18 01:00</Timestamp>
<Source>Ipsum Lorum</Source>
<AsyncReplyFlag>true</AsyncReplyFlag>
<AckRequired>true</AckRequired>
<MessageID>Ipsum Lorum</MessageID>
<CorrelationID />
</Header>
<Payload>
<MeterReadings xmlns:MeterReadings="http://iec.ch/TC57/2011/MeterReadings#" xmlns="http://iec.ch/TC57/2011/MeterReadings#">
<MeterReading>
<IntervalBlocks>
<IntervalReadings>
<timeStamp>2021-03-07T01:00:00 01:00</timeStamp>
<value>480.196</value>
<ReadingQualities>
<ReadingQualityType ref="3.0.0" />
</ReadingQualities>
</IntervalReadings>
<IntervalReadings>
<ReadingType ref="11.0.7.3.1.2.12.1.1.0.0.0.0.101.0.3.72.0" />
</IntervalReadings>
</IntervalBlocks>
<Meter>
<mRID>0000000000000</mRID>
<status>
<remark>Ipsum Lorum</remark>
<value>ESP</value>
</status>
</Meter>
<UsagePoint>
<mRID>73599900000000</mRID>
</UsagePoint>
</MeterReading>
</MeterReadings>
</Payload>
</RequestMessage>
我無法決議它,我嘗試使用其他執行緒中的示例。我試圖不使用 OPENXML 解決方案,因為需要 DECLARE 并執行內置程序以定期從記憶體中清除 XML。我正在嘗試使用 OUTER APPLY 解決方案。就像
它為時間戳列回傳 null。
select
t.file_created_time
,c.value('(Timestamp)[1]','varchar(max)') as timestamp
from load.t t
OUTER APPLY t.xml_data.nodes('RequestMessage/Header') as m(c)
uj5u.com熱心網友回復:
請嘗試以下解決方案。
從 SQL Server 2005 開始,在處理 XML 資料型別時,最好使用基于 w3c 標準的 XQuery 語言。
Microsoft 專有OPENXML和它的伙伴sp_xml_preparedocument,sp_xml_removedocument保留它只是為了與過時的 SQL Server 2000 向后兼容。它們的使用減少到很少的邊緣情況。
我必須注釋掉以下標記<!--<IntervalReadings>-->以使您的 XML 格式正確。
XML Header片段有一個默認的命名空間:
- xmlns="http://iec.ch/TC57/2011/schema/message"
XML Payload片段有自己的兩個附加命名空間:
- xmlns:MeterReadings="http://iec.ch/TC57/2011/MeterReadings#"
- xmlns="http://iec.ch/TC57/2011/MeterReadings#"
應該考慮命名空間。
看看下面。
SQL
DECLARE @tbl TABLE (ID INT IDENTITY PRIMARY KEY, xml_data XML);
INSERT INTO @tbl (xml_data) VALUES
(N'<RequestMessage xmlns="http://iec.ch/TC57/2011/schema/message"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="Message.xsd">
<Header>
<Verb>created</Verb>
<Noun>MeterReadings</Noun>
<Timestamp>2021-03-08T00:57:18 01:00</Timestamp>
<Source>Ipsum Lorum</Source>
<AsyncReplyFlag>true</AsyncReplyFlag>
<AckRequired>true</AckRequired>
<MessageID>Ipsum Lorum</MessageID>
<CorrelationID/>
</Header>
<Payload>
<MeterReadings xmlns:MeterReadings="http://iec.ch/TC57/2011/MeterReadings#"
xmlns="http://iec.ch/TC57/2011/MeterReadings#">
<MeterReading>
<IntervalBlocks>
<IntervalReadings>
<timeStamp>2021-03-07T01:00:00 01:00</timeStamp>
<value>480.196</value>
<ReadingQualities>
<ReadingQualityType ref="3.0.0"/>
</ReadingQualities>
</IntervalReadings>
<!--<IntervalReadings>-->
<ReadingType ref="11.0.7.3.1.2.12.1.1.0.0.0.0.101.0.3.72.0"/>
</IntervalBlocks>
<Meter>
<mRID>0000000000000</mRID>
<status>
<remark>Ipsum Lorum</remark>
<value>ESP</value>
</status>
</Meter>
<UsagePoint>
<mRID>73599900000000</mRID>
</UsagePoint>
</MeterReading>
</MeterReadings>
</Payload>
</RequestMessage>');
-- DDL and sample data population, end
WITH XMLNAMESPACES(DEFAULT 'http://iec.ch/TC57/2011/schema/message')
SELECT id
, c.value('(Noun/text())[1]','VARCHAR(30)') AS Noun
, c.value('(Timestamp/text())[1]','DATETIMEOFFSET(0)') AS [timestamp]
FROM @tbl
CROSS APPLY xml_data.nodes('/RequestMessage/Header') AS t(c);
輸出
---- --------------- ----------------------------
| id | Noun | timestamp |
---- --------------- ----------------------------
| 1 | MeterReadings | 2021-03-08 00:57:18 01:00 |
---- --------------- ----------------------------
uj5u.com熱心網友回復:
您需要在 XQuery 的 XML 檔案中尊重并包含XML 名稱空間!
<RequestMessage xmlns="http://iec.ch/TC57/2011/schema/message"
**********************************************
嘗試這樣的事情:
WITH XMLNAMESPACES(DEFAULT N'http://iec.ch/TC57/2011/schema/message')
SELECT
t.id,
c.value('(Timestamp)[1]','varchar(max)') as timestamp
FROM
load.t t
CROSS APPLY
t.xml_data.nodes('RequestMessage/Header') AS m(c)
此外,當嘗試在我的 SQL Server 上運行它時,我收到一個錯誤,即所示的 XML 格式不正確.....
更新:
如果您還需要訪問該Payload部分中的位- 您還需要尊重該XML 命名空間:
<MeterReadings xmlns:MeterReadings="http://iec.ch/TC57/2011/MeterReadings#"
xmlns="http://iec.ch/TC57/2011/MeterReadings#">
***********************************************
嘗試這個:
WITH XMLNAMESPACES(N'http://iec.ch/TC57/2011/schema/message' as hdr,
N'http://iec.ch/TC57/2011/MeterReadings#' as mr)
SELECT
t.id,
c.value('(hdr:Timestamp)[1]', 'varchar(50)') AS timestamp,
col.value('(mr:MeterReading/mr:IntervalBlocks/mr:IntervalReadings/mr:timeStamp)[1]', 'varchar(50)') AS MeterReadingsTimestamp
FROM
load.t t
CROSS APPLY
t.xml_data.nodes('/hdr:RequestMessage/hdr:Header') AS m(c)
CROSS APPLY
t.xml_data.nodes('/hdr:RequestMessage/hdr:Payload/mr:MeterReadings') AS mr(col)
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/336027.html
標籤:sql sql-server xml 查询语句 查询
上一篇:如果日期不為空或為空,如何獲取開始日期和到期日期之間的資料?
下一篇:提交而不是回滾?
