【问题标题】:Shredding XML with unknown schema使用未知模式粉碎 XML
【发布时间】:2013-09-23 18:43:46
【问题描述】:

我必须将具有未知架构的 XML 分解到一个表中。我不知道 XML 中有哪些元素。而且我也不知道 XML 格式。在某些情况下,XML 数据以属性为中心,在某些情况下,它以元素为中心。

例如 - 我有两个 XML -

<Root>
   <Recorset>
       <RecordsetId>1</RecordsetId>
       <RecordsetName>name1</RecordsetName>
  </Recorset>
</Root>

<Root>
     <Recorset RecordsetId="2" RecordsetName="name2"></Recorset>
</Root>

XML 可以有任何其他元素/属性。我需要使用从 OPENXML 生成的 EDGE 表来捕获元素/属性名称和相应的数据。

最简单的方法是什么?

我需要给定格式的输出 -

RecodrsetId   RecordsetName
1             Name1
2             Name2

【问题讨论】:

    标签: sql-server xml openxml


    【解决方案1】:

    这样的?

    select
        C.Name,
        C.Value
    from @Data.nodes('//*') as T(C)
        outer apply (
            select
                T.C.value('local-name(.)', 'nvarchar(max)') as Name,
                T.C.value('(./text())[1]', 'nvarchar(max)') as Value
            union all
            select
                A.C.value('local-name(.)', 'nvarchar(max)') as Name,
                A.C.value('.', 'nvarchar(max)') as Value
            from T.C.nodes('@*') as A(C)
        ) as C
    where C.Value is not null
    

    sql fiddle demo

    【讨论】:

    • 感谢@Roman 的回答。但我找不到任何从检索到的数据创建数据透视表的方法。我已经编辑了问题以提及预期的输出。抱歉,之前没有提过。
    • @AgentSQL 所以你想要动态列?我的意思是您希望从 xml 中获取所有元素/属性,然后动态创建 n 列?还是只需要 RecordSetID、recordSetName?
    • 是的,先生。我需要动态创建 n 列。
    • @AgentSQL 和您的 XML 可能是什么?如果您对 xml 不了解,这可能会很棘手,尤其是将节点按行链接在一起
    • 是的,它可以是任何东西。我尝试在从 OPENXML 生成的 EDGE 表上使用关系,但它需要大量的字符串操作。而且我一次只能处理一种格式(以元素为中心或以属性为中心)。
    猜你喜欢
    • 1970-01-01
    • 2011-09-12
    • 2020-03-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-07
    相关资源
    最近更新 更多