SQL Server 2005插入父/子xml数据

Jam*_*Orr 0 c# xml sql-server ado.net bulkinsert

给出一个如下所示的xml文档:

  <parentRecords>
    <parentRecord field1="foo" field2="bar">
      <childRecord field1="test" field2="text" />
      <childRecord field1="test2" field2="text2" />
    </parentRecord>
    <parentRecord field1="foo2" field2="bar2">
      <childRecord field1="test3" field2="text3" />
      <childRecord field1="test4" field2="text4" />
    </parentRecord>
  </parentRecords>
Run Code Online (Sandbox Code Playgroud)

SQL Server 2005中将此文档传递给存储过程的最快方法是什么,该存储过程将父记录和子记录插入到一​​组表中,其中父表具有标识列,子表引用父表一把外键?

ParentTable
-----------
ParentID identity PK int
Field1 nvarchar
Field2 nvarchar

ChildTable
----------
ChildID identity PK int
ParentID FK int
Field1 nvarchar
Field2 nvarchar
Run Code Online (Sandbox Code Playgroud)

我正在使用ADO.NET和.NET 3.5与C#.我可以选择将数据作为xml参数类型或文本类型发送.我可以使用新奇的sql 2005 XQuery东西或oldschool SQL 2000 OPENXML样式.或者,如果实际上可以使用SqlBulkInsert或类似的东西来完成这些插入,那么我最沮丧的是(在这种情况下性能很重要.)感谢您的帮助!


编辑:

看起来插入父/子集确实看起来很困难.我无法尝试学习LINQ to SQL并将该框架集成到我的产品中(我们在这里处于开发周期!)并且我无法在Xml批量插入工具中获得太多牵引力,尽管它看起来像可以用于此目的.最后,我重新构建了表以在两个表上使用GUID主键,并在API中生成完整记录.然后我能够使用ADO 2.0 SqlBulkInsert高速发送数据.答案授予Daniel Miller,因为SQL Server Bulk Load在没有重新构建我的应用程序的情况下获得成功的机会最大.

gbn*_*gbn 5

像这样的东西将提取父母,然后是父母领域的孩子

DECLARE @fooxml xml

SET @fooxml = N'<parentRecords>
    <parentRecord field1="foo" field2="bar">
      <childRecord field1="test" field2="text" />
      <childRecord field1="test2" field2="text2" />
    </parentRecord>
    <parentRecord field1="foo2" field2="bar2">
      <childRecord field1="test3" field2="text3" />
      <childRecord field1="test4" field2="text4" />
    </parentRecord>
  </parentRecords>'

SELECT
    x.item.value('@field1', 'varchar(100)') AS field1,
    x.item.value('@field2', 'varchar(100)') AS field2
FROM
    @fooxml.nodes('/parentRecords/parentRecord') x(item)

SELECT
    x.item.value('@field1', 'varchar(100)') AS field1,
    x.item.value('@field2', 'varchar(100)') AS field2,
    y.item.value('@field2', 'varchar(100)') AS childfield2,
    y.item.value('@field2', 'varchar(100)') AS childfield2
FROM
    @fooxml.nodes('/parentRecords/parentRecord') x(item)
    CROSS APPLY
    x.item.nodes('./childRecord') AS y(item)
Run Code Online (Sandbox Code Playgroud)