2010-07-06 23 views
3

压扁XML我有这样的XML在T-SQL:在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 

当然,我正在寻找在这里是将元素节点转换为行,但我无法获得更多的字段值或索引在一次...

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

完美!谢谢! :) – 2010-07-06 10:31:17

+0

我刚刚加了一点:WHERE SubEl.SubElem.value('local-name(。)','varchar(100)')<>'Index' – 2010-07-06 10:35:41

相关问题