Чтение нескольких строк из столбца xml в таблицу - PullRequest
0 голосов
/ 18 сентября 2018

Мне трудно читать данные из измерений, хранящихся в виде столбцов 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 голосов
/ 18 сентября 2018

Вы можете использовать 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...