Разбор вложенного XML в таблицу SQL - PullRequest
5 голосов
/ 08 ноября 2011

Каким будет правильный способ анализа следующего блока XML в таблице SQL Server в соответствии с желаемой разметкой (ниже)? Можно ли сделать это с помощью одного оператора SELECT, без UNION или цикла? Любой берущий? Заранее спасибо. Входной XML:

<ObjectData>
  <Parameter1>some value</Parameter1>
  <Parameter2>other value</Parameter2>
  <Dates>
    <dateTime>2011-02-01T00:00:00</dateTime>
    <dateTime>2011-03-01T00:00:00</dateTime>
    <dateTime>2011-04-01T00:00:00</dateTime>
  </Dates>
  <Values>
    <double>0.019974</double>
    <double>0.005395</double>
    <double>0.004854</double>
  </Values>
  <Description>
    <string>this is row 1</string>
    <string>this is row 2</string>
    <string>this is row 3</string>
  </Values>
</ObjectData>

Требуемый вывод таблицы:

Parameter1  Parameter2      Dates               Values      Description

Some value  Other value 2011-02-01 00:00:00.0   0.019974    this is row 1
Some value  Other value 2011-03-01 00:00:00.0   0.005395    this is row 2
Some value  Other value 2011-04-01 00:00:00.0   0.004854    this is row 3

Я после оператора SELECT SQL с использованием функциональности OPENXML или xml.nodes (). Например, следующий оператор SELECT приводит к получению значений и дат (то есть всех перестановок значений и дат), чего я хочу избежать.

SELECT 
doc.col.value('Parameter1[1]', 'varchar(20)') Parameter1, 
doc.col.value('Parameter2[1]', 'varchar(20)') Parameter2, 
doc1.col.value('.', 'datetime') Dates ,
doc2.col.value('.', 'float') [Values] 
FROM 
@xml.nodes('/ObjectData') doc(col),
@xml.nodes('/ObjectData/Dates/dateTime') doc1(col),
@xml.nodes('/ObjectData/Values/double') doc2(col);

Ответы [ 3 ]

7 голосов
/ 08 ноября 2011

Вы можете использовать таблицу чисел для выбора первой, второй, третьей и т. Д. Строки из дочерних элементов. В этом запросе я ограничил количество возвращаемых строк, если указаны даты. Если значений или описаний больше, чем дат, необходимо изменить объединение, чтобы учесть это.

declare @XML xml = '
<ObjectData>
  <Parameter1>some value</Parameter1>
  <Parameter2>other value</Parameter2>
  <Dates>
    <dateTime>2011-02-01T00:00:00</dateTime>
    <dateTime>2011-03-01T00:00:00</dateTime>
    <dateTime>2011-04-01T00:00:00</dateTime>
  </Dates>
  <Values>
    <double>0.019974</double>
    <double>0.005395</double>
    <double>0.004854</double>
  </Values>
  <Description>
    <string>this is row 1</string>
    <string>this is row 2</string>
    <string>this is row 3</string>
  </Description>
</ObjectData>'

;with Numbers as
(
  select number
  from master..spt_values
  where type = 'P'
)
select T.N.value('Parameter1[1]', 'varchar(50)') as Parameter1,
       T.N.value('Parameter2[1]', 'varchar(50)') as Parameter2,
       T.N.value('(Dates/dateTime[position()=sql:column("N.Number")])[1]', 'datetime') as Dates,
       T.N.value('(Values/double[position()=sql:column("N.Number")])[1]', 'float') as [Values],
       T.N.value('(Description/string[position()=sql:column("N.Number")])[1]', 'varchar(max)') as [Description]
from @XML.nodes('/ObjectData') as T(N)
  cross join Numbers as N
where N.number between 1 and (T.N.value('count(Dates/dateTime)', 'int'))
2 голосов
/ 08 ноября 2011

Используйте функцию OPENXML .Это поставщик набора строк (он возвращает набор строк, проанализированных из XML) и, следовательно, может использоваться в SELECT или INSERT, например:

INSERT INTO table SELECT * FROM OPENXML(source, rowpattern, flags)

. Для ясности см. Первый пример в ссылке на документацию.1006 *

0 голосов
/ 08 ноября 2011

Как правило, если вы хотите проанализировать XML, вы должны сделать это на языке программирования Perl, Python, Java или C #, который а) имеет XML DOM и б) может взаимодействовать с реляционной базой данных.

Вот короткая статья, которая показывает вам некоторые основы чтения и записи XML на C # ... и даже содержит пример того, как создать документ XML из запроса SQL (в одну строку!):

http://www.c -sharpcorner.com / uploadfile / Махеш / readwritexmltutmellli2111282005041517am / readwritexmltutmellli21.aspx

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