【发布时间】:2021-12-10 11:53:07
【问题描述】:
我在表中有一个 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 解决方案。 就像 How to parse XML data in SQL server table 或 Query XML with nested nodes on Cross Apply 中的 Shugos 解决方案。
它不起作用。
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)
【问题讨论】:
-
正如@marc_s 已经提到的,XML 格式不正确。
-
提问时,您需要提供minimal reproducible example: (1) DDL 和样本数据填充,即 CREATE 表和 INSERT T-SQL 语句。 (2) 你需要做什么,即逻辑和你的代码尝试在 T-SQL 中实现它。 (3) 期望的输出,基于上述#1 中的样本数据。 (4) 您的 SQL Server 版本 (SELECT @@version;)。
-
@YitzhakKhabinsky 感谢您提供有关我应该在帖子中包含的内容的信息。我认为 XML 文本和我正在运行的 sql 代码就足够了,但我知道有些人可能使用的是非常旧版本的 sql server,所以我会认为将来会这样。
-
现在我了解命名空间的问题是我搜索了一下并发现例如 stackoverflow.com/questions/22818591/… 和评论 vittore 似乎暗示不需要使用 WITH 和命名空间声明的问题。相反,可以只接受任何命名空间。但是我还没有让它工作,但下一步很有趣。我有动力尝试在没有 CTE 的情况下工作。
标签: sql sql-server xml tsql xquery