从xml列读取多行到表

时间:2018-09-18 07:57:36

标签: sql sql-server xml tsql

我正在努力从存储为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字段。但是,如何创建查询以生成表呢?

致谢,丹尼尔

1 个答案:

答案 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)

结果:

enter image description here

如果您在一个文件中有多个度量(例如,具有标识每个度量的属性):

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)

结果:

enter image description here