我正在努力从存储为xml列的测量中读取数据。我的xml文件如下所示:
<Data t0="2018-09-18T07:43:11.882+01:00" dt="2.003338853E-5">
<Measurement>
<Value>2.075</Value>
<Value>2.175</Value>
<Value>2.275</Value>
<Value>2.325</Value>
<Value>2.425</Value>
...
</Measurement>
</Data>
结果我需要的是一个包含值的表。
我已经尝试过的是这个
SELECT CONVERT(varchar(max),c.query('data(Value)')) as XMLValues
FROM [dbo].[T_Measurement] as t1
CROSS APPLY Measurement.nodes('/Data/Measurement') x(c)
会创建一个用空格分隔值的结果xml字段。但是,如何创建查询以生成表呢?
致谢,丹尼尔
答案 0 :(得分:1)
您可以使用query()
提取值,然后使用value
将其转换为数字类型:
declare @tmp table (Measurement xml)
insert into @tmp
select
'<Data t0="2018-09-18T07:43:11.882+01:00" dt="2.003338853E-5">
<Measurement>
<Value>2.075</Value>
<Value>2.175</Value>
<Value>2.275</Value>
<Value>2.325</Value>
<Value>2.425</Value>
</Measurement>
</Data>'
SELECT
Tbl.Col.value('.','decimal(18,3)') as XMLValues
FROM @tmp as t1
CROSS APPLY Measurement.nodes('/Data/Measurement/Value') Tbl(Col)
结果:
如果您在一个文件中有多个度量(例如,具有标识每个度量的属性):
DECLARE @tmp TABLE (Measurement XML)
INSERT INTO @tmp
SELECT '<Data t0="2018-09-18T07:43:11.882+01:00" dt="2.003338853E-5">
<Measurement setId="1">
<Value>1.075</Value>
<Value>1.175</Value>
<Value>1.275</Value>
<Value>1.325</Value>
<Value>1.425</Value>
</Measurement>
<Measurement setId="2">
<Value>2.076</Value>
<Value>2.176</Value>
<Value>2.276</Value>
<Value>2.326</Value>
<Value>2.426</Value>
</Measurement>
</Data>'
SELECT
Tbl.Col.value('../@setId', 'int') as setId,
Tbl.Col.value('.', 'decimal(18,3)') as XMLValues
FROM @tmp AS t1
CROSS APPLY Measurement.nodes('/Data/Measurement/Value') Tbl(Col)
结果: