【问题标题】:Migrate XML data to Microsoft SQL Server 2016将 XML 数据迁移到 Microsoft SQL Server 2016
【发布时间】:2016-04-06 19:34:20
【问题描述】:

我想将 XML 文件中的数据迁移到 MS SQL Server 2016

我的表格文件如下所示:

[propertyid], [type], [object], [keyname], [keyvalue]

表中的数据将从 XML 映射,如下所示:

1, community, Private Community, name, Private Community   
2, community, Private Community, communityname, Private Community  
3, community, Private Community, server, chip.xyz.com:423132  
4, community, Private Community, windowtitle, Private Community  
5, community, Private Community, websiteurl, http://something 

XML 文件如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<doc>
<object type="community">
<name>
<![CDATA[Private Community]]>
</name>
<communityname>
<![CDATA[Private Community]]>
</communityname>
<server>
<![CDATA[chip.xyz.com:423132]]>
</server>
<windowtitle>
<![CDATA[Private Community]]>
</windowtitle>
<websiteurl>
<![CDATA[http://something]]>
</websiteurl>
</object>
</doc>

有什么方法我可以通过脚本或任何方式来完成,因为上面提到的 XML 只是我正在使用并拥有许多记录的大型 XML 的一部分

【问题讨论】:

标签: sql-server xml xsd


【解决方案1】:

试试这样:

DECLARE @xml XML=
'<?xml version="1.0" encoding="UTF-8"?>
<doc>
  <object type="community">
    <name>
Private Community
</name>
    <communityname>
Private Community
</communityname>
    <server>
chip.xyz.com:423132
</server>
    <windowtitle>
Private Community
</windowtitle>
    <websiteurl>
http://something
</websiteurl>
  </object>
</doc>';

我替换换行符并修剪字符串,希望这符合您的需求 我不知道的是:结构如何,如果有更多数据。我的查询以doc 作为根,以doc/name 作为“类型”,所有节点名称作为“键名”。

使用“INTO MyNewlyCreatedTable”动态创建具有所需结构的表。如果你已经有你的桌子,你把这条线拿出来写在一个合适的INSERT INTO MyTable(colName1,colName2,...)上面,然后是SELECT ...

SELECT ROW_NUMBER() OVER(ORDER BY (SELECT NULL)) AS propertyid
      ,LTRIM(RTRIM(REPLACE(REPLACE(Doc.value('(object/@type)[1]','varchar(max)'),CHAR(13),''),CHAR(10),''))) AS [type]
      ,LTRIM(RTRIM(REPLACE(REPLACE(Doc.value('(object/name)[1]','varchar(max)'),CHAR(13),''),CHAR(10),''))) AS [object]
      ,LTRIM(RTRIM(REPLACE(REPLACE(Nod.value('local-name(.)','varchar(max)'),CHAR(13),''),CHAR(10),''))) AS keyname
      ,LTRIM(RTRIM(REPLACE(REPLACE(Nod.value('.','varchar(max)'),CHAR(13),''),CHAR(10),''))) AS keyvalue
INTO MyNewlyCreatedTable
FROM @xml.nodes('/doc') AS A(Doc) 
CROSS APPLY Doc.nodes('object/*') AS B(Nod)

这是新建表的内容

SELECT * FROM MyNewlyCreatedTable;

+------------+-----------+-------------------+---------------+---------------------+
| propertyid | type      | object            | keyname       | keyvalue            |
+------------+-----------+-------------------+---------------+---------------------+
| 1          | community | Private Community | name          | Private Community   |
+------------+-----------+-------------------+---------------+---------------------+
| 2          | community | Private Community | communityname | Private Community   |
+------------+-----------+-------------------+---------------+---------------------+
| 3          | community | Private Community | server        | chip.xyz.com:423132 |
+------------+-----------+-------------------+---------------+---------------------+
| 4          | community | Private Community | windowtitle   | Private Community   |
+------------+-----------+-------------------+---------------+---------------------+
| 5          | community | Private Community | websiteurl    | http://something    |
+------------+-----------+-------------------+---------------+---------------------+

只是为了测试

--CleanUp
DROP TABLE MyNewlyCreatedTable;

【讨论】: