2010-07-06 3 views
3

У меня есть этот XML в T-SQL:Сведение XML в SQLXML

<Elements> 
    <Element> 
     <Index>1</Index> 
     <Type>A</Type> 
     <Code>AB</Code> 
     <Time>1900-01-01T10:21:00</Time> 
    </Element> 
    <Element> 
     <Index>2</Index> 
     <Type>M</Type> 
     <Code>AL</Code> 
     <Time>1900-01-01T10:22:00</Time> 
    </Element> 
</Elements> 

И я хочу, чтобы получить его в виде таблицы:

Index FieldName FieldValue 
-------- ------------ ---------- 
1  Index  1 
1  Type   A 
1  Code   AB 
1  Time   1900-01-01T10:21:00 
2  Index  2 
2  Type   M 
2  Code   AL 
2  Time   1900-01-01T10:22:00 

Конечно, то, что я ищу здесь является для поворота узлов Element в строки, но я не могу получить больше, чем просто значение поля или индекс в то время ...

select 
-- r.value('.[1]', 'nvarchar(10)') Value, 
-- r.value('fn:local-name(.)', 'nvarchar(50)') FieldName 
    r.value('Index[1]', 'nvarchar(10)') f, 
    r.value('./node()[fn:local-name(.)]', 'nvarchar(10)') v 
from 
    @content.nodes('/Elements/*') as records(r) 

ответ

3

Вы могли бы попробовать что-то вроде этого:

SELECT 
    El.Elem.value('(Index)[1]', 'int'), 
    SubEl.SubElem.value('local-name(.)', 'varchar(100)') AS 'Field Name', 
    SubEl.SubElem.value('.', 'varchar(100)') AS 'Field Value' 
FROM 
    @content.nodes('/Elements/Element') AS El(elem) 
CROSS APPLY 
    El.Elem.nodes('*') AS SubEl(SubElem) 

Это, кажется, дает желаемый результат в моем тестовом случае.

Вы в основном должны выбрать все /Elements/Element узлов на первом этапе, получает значение индекса, а затем на втором этапе, выберите все дочерние узлы (/*) для любого заданного <Element> узла.

+0

Отлично! Спасибо! :) –

+0

Я просто немного прикрепил: WHERE SubEl.SubElem.value ('local-name (.)', 'Varchar (100)') <> 'Index' –