2013-09-23 5 views
3

Я должен уничтожить XML с неизвестной схемой в таблицу. Я не знаю, какие элементы существуют в XML. И я также не знаю формат XML. В некоторых случаях данные XML являются атрибутами, а в некоторых случаях они являются центрированными.Измельчение XML с неизвестной схемой

Для примера - У меня есть два XML -

<Root> 
    <Recorset> 
     <RecordsetId>1</RecordsetId> 
     <RecordsetName>name1</RecordsetName> 
    </Recorset> 
</Root> 

И

<Root> 
    <Recorset RecordsetId="2" RecordsetName="name2"></Recorset> 
</Root> 

XML-могут иметь любой другой элемент/атрибуты. Мне нужно захватить имя элементов/атрибутов и соответствующие данные, используя таблицу EDGE, созданную OPENXML.

Каков самый простой способ сделать это?

мне нужен выход в данном формате -

RecodrsetId RecordsetName 
1    Name1 
2    Name2 

ответ

3

что-то вроде этого?

select 
    C.Name, 
    C.Value 
from @Data.nodes('//*') as T(C) 
    outer apply (
     select 
      T.C.value('local-name(.)', 'nvarchar(max)') as Name, 
      T.C.value('(./text())[1]', 'nvarchar(max)') as Value 
     union all 
     select 
      A.C.value('local-name(.)', 'nvarchar(max)') as Name, 
      A.C.value('.', 'nvarchar(max)') as Value 
     from T.C.nodes('@*') as A(C) 
    ) as C 
where C.Value is not null 

sql fiddle demo

+0

Спасибо @Roman за ваш ответ. Но я не мог найти способ создания сводной таблицы из извлеченных данных. Я отредактировал вопрос, чтобы упомянуть ожидаемый результат. Извините, не упоминая об этом раньше. – AgentSQL

+0

@AgentSQL, так что вам нужны динамические столбцы? Я имею в виду, что вы хотите, чтобы все элементы/атрибуты извлекались из xml, а затем динамически создавали n столбцов? Или вы хотите только RecordSetID, recordSetName? –

+0

Да, сэр. Мне нужно динамически создавать n столбцов. – AgentSQL

Смежные вопросы