【问题标题】:Processing XML Hierarchy with MS SQL使用 MS SQL 处理 XML 层次结构
【发布时间】:2013-09-23 20:56:35
【问题描述】:

如何将以下 XML 层次结构指定到 Microsoft SQL 中的可读列中?

<transaction id=1>
    <item id=1>
        <price>1</price>
    </item>
    <item id=2>
        <price>1</price>
    </item>
</transaction>
<transaction>
    <item id=1>
        <price>1</price>
    </item>
</transaction>

例如

select
    x.i.value('(????)','Varchar(max)') [TransId]
    x.i.value('(????)','Varchar(max)') [ItemId]
    x.i.value('(????)','Varchar(max)') [PriceId]
from @xml.nodes('/transaction') x(i)

提前致谢。

【问题讨论】:

    标签: sql sql-server xml xpath sqlxml


    【解决方案1】:

    属性值必须始终出现在 XML 中的引号中。 不确定所需的输出。一个例子是:

    declare @xml xml
    Select @xml=
    '<transaction id="1">
        <item id="1">
            <price>1</price>
        </item>
        <item id="2">
            <price>2</price>
        </item>
    </transaction>
    <transaction>
        <item id="1">
            <price>3</price>
        </item>
    </transaction>'
    
    SELECT
        y.value('../@id','int') as TransactionID,
        y.value('@id','int') as ItemID,
        y.value('(./price/text())[1]', 'Varchar(max)') as Price
    FROM @xml.nodes('/transaction/item') as x(y)
    order by TransactionID,ItemID
    

    输出:

    NULL    1   3
    1       1   1
    1       2   2
    

    【讨论】:

    • 好的,所以我查看了一些教程指南并采纳了您的建议。我带着结果回来了,但是它只需要 20 分钟来粉碎 1 个 XML 文件。如果我删除父查找(../@id),那么它会立即返回结果。问题是父 ID 不在子元素中作为属性,所以我必须把它拉回来。关于如何专门针对此瓶颈调整性能的任何建议。或者如何理解为什么这是一个瓶颈。我尝试将 XSD 设置到 SQL 模式中,然后创建主 XML 索引和辅助 XML 索引并获得相同的速度结果。
    【解决方案2】:

    实际上,通常使用apply 将 XML 从父级分解到子级会更快,如下所示:

    select
        t.c.value('@id','int') as TransId,
        i.c.value('@id','int') as ItemId,
        i.c.value('(price/text())[1]', 'int') as PriceId
    from @xml.nodes('transaction') as t(c)
        outer apply t.c.nodes('item') as i(c)
    order by TransId, ItemID
    

    sql fiddle demo

    【讨论】:

    • 感谢百万人,这是我遇到的性能问题。我试图向后建立层次结构。运行时间从 20 分钟缩短到 2 秒。再次感谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-21
    • 1970-01-01
    • 2010-09-12
    • 2011-10-17
    • 2021-05-31
    • 2017-05-25
    相关资源
    最近更新 更多