在SQLXML中展平XML
我在T-SQL中有以下XML:在SQLXML中展平XML,xml,pivot,sqlxml,Xml,Pivot,Sqlxml,我在T-SQL中有以下XML: <Elements> <Element> <Index>1</Index> <Type>A</Type> <Code>AB</Code> <Time>1900-01-01T10:21:00</Time> </Element> <Element
<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)
您可以尝试以下方法:
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
节点,获取它们的索引值,然后在第二步中,为任何给定的
节点选择所有子节点(/*
)。我刚刚补充了一点:WHERE SubEl.SubElem.value('local-name(.),'varchar(100)'index'