递归地将xml分解到数据库中

弗雷德·扬德

我有以下XML数据和Element表。

DECLARE @input XML = '<root>
     <C1>
       <C2>
         <C3>           <C4>data1</C4>       </C3>         
       </C2>
       <C2>
         <C3>data2</C3>
       </C2>
     </C1>
     <D1>
        <D2>data3</D2>
        <D2>data4</D2>
     </D1>
    </root>'

元素表:(这只是一个示例,因此可以更改以匹配适当的解决方案。)

CREATE TABLE Element (  elementId INT IDENTITY PRIMARY KEY, 
elementName VARCHAR (200) NOT NULL, 
parentId INT,   
data VARCHAR(300) );

根据@input,根元素是C1和D1的父级,那么C1是C2的父级,...

SQL Server 2012/2014用CTE(或任何其他类型的SQL对象)编码存储过程以将所有元素名称递归放入Element表的解决方案是什么?

在这种情况下,数据列将填充数据,C4和第二个C3,以及D2元素具有数据,其余元素为null。

我也看到了层次数据类型,我想知道这是否有助于解决此问题?

米凯尔·埃里克森(Mikael Eriksson)

使用OpenXML,您可以使用metaproperties使用IDParentID获取XML的表表示形式

合并中使用XML查询将使您可以在XML标识列和DOM节点ID之间创建映射elementId

最后一步是使用映射表来更新parentIdElement

SQL小提琴

MS SQL Server 2008架构设置

CREATE TABLE Element (  elementId INT IDENTITY PRIMARY KEY, 
elementName VARCHAR (200) NOT NULL, 
parentId INT,   
data VARCHAR(300) );

查询1

declare @input xml = '
<root>
  <C1>
    <C2>
      <C3>
        <C4>data1</C4>
      </C3>
    </C2>
    <C2>
      <C3>data2</C3>
    </C2>
  </C1>
  <D1>
    <D2>data3</D2>
    <D2>data4</D2>
  </D1>
</root>';

-- OpenXML handle
declare @D int;

-- Table that capture output of merge with mapping between 
-- DOM node id and the identity column elementID in Element 
declare @T table
(
  ID int,
  ParentID int,
  ElementID int
);

-- Parse XML and get a handle
exec sp_xml_preparedocument @D output, @input;

-- Add rows to Element and fill the mapping table @T
merge into dbo.Element as E
using ( 
      select *
      from openxml(@D, '//*') with 
        (
          ID int '@mp:id',
          ParentID int '@mp:parentid',
          Data varchar(300) 'text()',
          ElementName varchar(200) '@mp:localname'
        )
      ) as S
on 0 = 1
when not matched by target then
  insert (elementName, data) values (S.ElementName, S.data)
output S.ID, S.ParentID, inserted.elementID into @T;

-- Update parentId in Elemet
update E
set parentId =  T2.ElementID
from dbo.Element as E
  inner join @T as T1
    on E.elementId = T1.ElementID
  inner join @T as T2
    on T1.ParentID = T2.ID


-- Relase the XML document
exec sp_xml_removedocument @D;

select *
from Element;

结果

| ELEMENTID | ELEMENTNAME | PARENTID |   DATA |
|-----------|-------------|----------|--------|
|         1 |        root |   (null) | (null) |
|         2 |          C1 |        1 | (null) |
|         3 |          C2 |        2 | (null) |
|         4 |          C3 |        3 | (null) |
|         5 |          C4 |        4 |  data1 |
|         6 |          C2 |        2 | (null) |
|         7 |          C3 |        6 |  data2 |
|         8 |          D1 |        1 | (null) |
|         9 |          D2 |        8 |  data3 |
|        10 |          D2 |        8 |  data4 |

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何最好地将表关联到数据库

来自分类Dev

如何安全地将HTML标记保存/检索到Rails数据库中?

来自分类Dev

使用PHP将Wiktionary XML数据转储到MySQL数据库中

来自分类Dev

XML到数据库

来自分类Dev

Xml到数据库

来自分类Dev

将数据库中的数据分离到页面中

来自分类Dev

将多个行值从数据库传递到XML

来自分类Dev

用于将xml传递到数据库的SQL查询

来自分类Dev

将XML文件同步到MySQL数据库

来自分类Dev

无法将数据设置到Rails的数据库中

来自分类Dev

将数据库中的表检索到phpexcel

来自分类Dev

将ZipFile对象存储到Django数据库中

来自分类Dev

将核心对象存储到SQLite数据库中

来自分类Dev

将视图计数存储到数据库中

来自分类Dev

将`tsv`文件插入到PostgreSQL数据库中

来自分类Dev

将ZipFile对象存储到Django数据库中

来自分类Dev

将图像存储到数据库中但面临异常

来自分类Dev

从目录将映像名称存储到数据库中

来自分类Dev

将URL保护和存储到数据库中

来自分类Dev

将IP存储到mysql数据库中

来自分类Dev

将数据库嵌入到Jar文件中

来自分类Dev

将类实现到数据库程序中

来自分类Dev

将 MySQL 数据库的特定表复制到 JDBC 中的 MariaDB 数据库

来自分类Dev

SQL动态地将数据从数据库存储到另一个数据库

来自分类Dev

将 xml 加载到数据库中(变量范围)

来自分类Dev

将 XML 文件插入 SQL Server 中的数据库

来自分类Dev

正确地将时间从数据库传递到laravel视图

来自分类Dev

如何在Python中有效地将参数解译到数据库

来自分类Dev

正确地将时间从数据库传递到laravel视图