在SQLXML中压缩XML

3

我有这段T-SQL中的XML:

<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)
1个回答

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>节点的所有子节点(/*)。


我只是添加了一个小条件:WHERE SubEl.SubElem.value('local-name(.)', 'varchar(100)') <> 'Index' - Matt W

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接