繁体   English   中英

从XML RAW数据批量插入SQL Server 2008 R2

[英]Bulk insert into SQL Server 2008 R2 from XML RAW data

我有一个如下的XML结构:

<tables>
  <table name="tableName1">
    <row ID="34" col1="data" col2="dom" />
    <row ID="35" col1="data2" col2="dom2" />
  </table>
  <table name="tableName2">
    <row ID="1" col1="data" col2="dom" col3="item1" />
    <row ID="3" col1="data2" col2="dom2" col3="item2" />
    <row ID="7" col1="data4" col3="item3" />
  </table>
  ...
<tables>

基本上,表节点包含通过选择FOR XML RAW创建的RAW数据。

现在,我想做相反的事情:读取XML并将数据插入到SQL Server 2008 R2数据库的各个表中。 但是,我希望加载过程要健壮,这意味着我不想在将来更改列名和表名时弄乱它们。 我需要从表节点的@name属性读取表名称并将数据插入到<Row>节点中的属性指定的<Row>中的过程。 我想到了一个存储过程,该存储过程将XML作为输入并执行其余操作。

数据量约为 70个表,范围从10到30,000行,总共不超过10万行。 我需要尽可能高效地执行此操作,批量加载将是最好的。

该过程不应该处理外键,因为XML内部的表顺序是建立的,因此可以通过在一个表之后再加载另一个表来保持FK约束。

但是,每个表中都有标识列,因此我必须做一个

SET Identity_Insert ON and SET Identity_Insert OFF

处理每个表之前和之后。 插入所有行后,我还需要重新设置每个表的种子。 哦,我需要进行整个交易,以便在出现问题时回退。

您建议我采用哪种方式:我应该继续使用T-SQL还是尝试用CLR SQL编写SP? 我应该使用XQuery还是可以使用一些批量插入方法?

感谢您的所有帮助!

基本上,您将必须遍历XML并根据结果集编写查询。

试试这个开始:

declare @i int;
declare @x xml;

------
SELECT @x = N'
<tables>
  <table name="tableName1">
    <row ID="34" col1="data" col2="dom" />
    <row ID="35" col1="data2" col2="dom2" />
  </table>
  <table name="tableName2">
    <row ID="1" col1="data" col2="dom" col3="item1" />
    <row ID="3" col1="data2" col2="dom2" col3="item2" />
    <row ID="7" col1="data4" col3="item3" />
  </table>
</tables>';


exec sp_xml_preparedocument @i output, @x


select ID, col1, col2
from OpenXml(@i, '/tables/table/row')
with (ID int, col1 nvarchar(30), col2 nvarchar(30))

exec sp_xml_removedocument @i

它将为您提供插入数据所需的列的列表(您可以在上一级获得表名称之前,只需更改SQL)

34  data    dom
35  data2   dom2
1   data    dom
3   data2   dom2
7   data4   NULL

接下来,您需要在此结果集上编写循环的语句。

仅供参考,您无需编写XML,可以从如下文件中读取:

SELECT @x = xCol.BulkColumn FROM OPENROWSET (BULK 'c:\Update.xml', SINGLE_BLOB) AS xCol;

当您处理相当大的XML文档时,我建议此时使用.net碎纸机。 您可以在CLR过程或外部工具中执行此操作。 您也可以使用SQL Server的xquery构建,但这会很慢。

但是,考虑到这个问题和您以前的问题(将数据从MS SQL Server 2008 R2转储到单个XML文件中 ),我认为您最好使用BCP实用程序甚至复制。 您的确切要求是什么?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM