0

次のような 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>

SQL Server 2005 で、親テーブルに ID 列があり、子テーブルが親を参照する一連のテーブルに親レコードと子レコードを挿入するストアド プロシージャにこのドキュメントを渡す最速の方法は何でしょうか。外部キー?

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

ChildTable
----------
ChildID identity PK int
ParentID FK int
Field1 nvarchar
Field2 nvarchar

C# で ADO.NET と .NET 3.5 を使用しています。データを xml パラメータ タイプまたはテキスト タイプとして送信するオプションがあります。SQL 2005 の最新の XQuery を使用することも、SQL 2000 の古い OPENXML スタイルを使用することもできます。または、SqlBulkInsert などを使用してこれらの挿入を実際に実行できる場合は、最速のものを選択します (この状況ではパフォーマンスが重要です)。助けてくれてありがとう!


編集:

親/子セットを挿入するのは、実際には難しいようです。私は LINQ to SQL を学び、そのフレームワークを自分の製品に統合しようとする立場にありませんでした (私たちはここで開発サイクルに入っています!)。この目的に使用できます。最後に、両方のテーブルで GUID プライマリ キーを使用するようにテーブルを再構築し、API で完全なレコードを生成しました。その後、ADO 2.0 SqlBulkInsert を使用してデータを高速で送信することができました。Daniel Miller に与えられた回答は、SQL Server Bulk Load が、アプリケーションを完全に再構築することなく成功する可能性が最も高かったためです。

4

4 に答える 4

4

マージを使用すると、親データと子データを同時に挿入できます

Create table #Master
(
 Id int Identity(1,1),
 MasterName Varchar(100)
)

Create Table #Intermediate
(MasterId int,
 ChildData XML)

 Create Table #Child
 (
 ChildId int identity(1,1),
 MasterId int,
 ChildName Varchar(100)
 )

Declare @XML XML='<Record>
                     <MasterRecord>
                        <Master>Master1</Master>
                        <ChildRecord>
                            <Child>Child11</Child>
                            <Child>Child12</Child>
                        </ChildRecord>
                     </MasterRecord>
                     <MasterRecord>
                        <Master>Master2</Master>
                        <ChildRecord>
                            <Child>Child21</Child>
                            <Child>Child22</Child>
                        </ChildRecord>
                     </MasterRecord>
                  </Record>'



MERGE #Master _MTR
USING (Select x.value('Master[1]','varchar(255)') AS masterName ,
              x.query('ChildRecord/Child') AS ChildData          
              From @XML.nodes('/Record/MasterRecord') e(x)) AS _XML
ON 1=0
WHEN NOT MATCHED THEN
INSERT (MasterName)
VALUES(_XML.MasterName)
OUTPUT INSERTED.Id, _XML.ChildData
INTO #Intermediate(MasterId,ChildData);


Insert Into #Child(MasterId,ChildName) 
Select  mas.Id, _data.value('(text())[1]', 'varchar(100)') as ChildName
from #Intermediate intr Inner Join #Master Mas
     On intr.MasterId=Mas.Id
CROSS APPLY ChildData.nodes('/Child') AS _chd(_data)

Select * from #Master
Select * from #Intermediate
select * from #Child
于 2013-05-23T18:01:51.110 に答える
2

SQL Server XML Bulk Loadが必要なようです

于 2009-04-16T01:49:37.540 に答える
-2

LINQ to SQL を検討してください。これで実際に簡単になります。

于 2009-04-15T21:25:20.623 に答える