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

时间:2012-02-06 11:06:48

标签: sql sql-server sqlclr

我有一个类似以下的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>节点中的属性指定的列中。我想到了一个存储过程,它将XML作为输入并完成剩下的工作。

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

该过程不应该处理外键,因为XML中的表的顺序是构建的,因此可以通过一个接一个地加载一个表来保持FK约束。

但是每个表中都有标识列,所以我必须执行

SET Identity_Insert ON and SET Identity_Insert OFF

处理每个表之前和之后。插入所有行后,我还需要重新设置每个表。哦,我需要在交易中做整个shebang,以便在出现问题时我可以回滚。

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

感谢您的帮助!

2 个答案:

答案 0 :(得分:2)

基本上,您必须遍历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;

答案 1 :(得分:1)

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

但是,看看这个和你之前的问题(Dump data into single XML file from MS SQL Server 2008 R2),我想你可能更喜欢使用像BCP实用程序甚至复制这样的东西。你有什么要求?