【问题标题】:Convert XML to table SQL Server 2005将 XML 转换为表 SQL Server 2005
【发布时间】:2018-12-22 01:52:37
【问题描述】:

我想知道如何读取 XML 数据并将其转换为 T-SQL 中的表?

例如:

<t1>
      <t2>
        <val>Opel</val>
        <t3>Merriva</t3>
        <t3>Zafira</t3>
      </t2>
      <t2>
        <val>Fiat</val>
        <t3>Albea</t3>
      </t2>
  </t1>

收件人:

表1:

id      value
----------------
1        Opel
2        Fiat

表2:

id      id_Table1       value
-----------------------------------
1          1            Merriva
2          1            Zafira
3          2            Albea

【问题讨论】:

    标签: sql sql-server xml tsql sql-server-2005


    【解决方案1】:

    我没有活动的 SQL-Server 2005 来测试这个(男孩,现在是 2018 年......!!!),但我认为,这个查询也可以在如此古老的版本中工作:

    DECLARE @xml XML=
    N'<t1>
        <t2>
        <val>Opel</val>
        <t3>Merriva</t3>
        <t3>Zafira</t3>
        </t2>
        <t2>
        <val>Fiat</val>
        <t3>Albea</t3>
        </t2>
    </t1>';
    
    --The CTE will return the CarName with a running index together with the related data as XML-node
    WITH Cars AS
    (
        SELECT ROW_NUMBER() OVER(ORDER BY (SELECT NULL)) AS t2_index
            ,t2.value(N'(val/text())[1]',N'nvarchar(100)') AS t2_val
            ,t2.query(N't3') AS t3_nodes
        FROM @xml.nodes(N'/t1/t2') A(t2)
    )
    --This part will append all related data with a running number for the related type data
    SELECT Cars.* 
        ,ROW_NUMBER() OVER(ORDER BY(SELECT NULL)) AS CarValueIndex
        ,t3.value(N'text()[1]',N'nvarchar(100)') AS CarValue
    INTO #tmpCars --write the result into a temp table
    FROM Cars
    OUTER APPLY t3_nodes.nodes(N't3') A(t3);
    
    --All data de-normalized
    SELECT * FROM #tmpCars;
    
    --This query will bring back the parent rows
    SELECT t2_index AS CarID
          ,t2_val AS CarName
    FROM #tmpCars
    GROUP BY t2_index,t2_val;
    
    --And this query will return the related child data
    SELECT CarValueIndex AS CarTypeID
          ,t2_index AS fk_CarID
          ,CarValue AS CarType
    FROM #tmpCars;
    
    GO
    DROP TABLE #tmpCars;
    

    如果有机会迁移到更现代的 SQL-Server,您真的应该这样做......

    更新

    根据this link.value().nodes() 函数是在 v2008 中引入的。但我有一个不好的记忆,它在 2005 年就已经工作了,可能与一些服务包一起......试试看。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-28
      • 2011-08-18
      • 2012-03-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多