1

私は2つのテーブルを持っています:

  • MasterReg(MasterID、収益、日付、説明); 列MasterIDですIdentity

  • DetailReg(DetailID、MasterID、NumValue); 列DetailIDですIdentity

openxml を使用して xml 文字列からデータを挿入しようとしています

insert into MasterReg (Revenue, Date, Desc) 
   Select Revenue, Date, Desc 
  From OPENXML(....

MasterRegこれにより、テーブルに5行が挿入されます

DetailRegMasterRegテーブルには、テーブルに挿入された値ごとに 6 行が含まれます

たとえば、テーブルMasterID=1には 6つのエントリがあります (1 つのエントリに対して 6 つのエントリ) 。DetailIDDetailRegDetailRegMaster

私のXMLは次のようになります。

<Root>
   <Detail>
      <Revenue>333300</Revenue>
      <Date>21/6/2011</Date>
      <Desc>desc text...</Desc>
      <NumValue value="56"/>
      <NumValue value="56"/>
      <NumValue value="56"/>
      <NumValue value="56"/>
      <NumValue value="56"/>
      <NumValue value="56"/>
   </Detail>
   <Detail>
      <Revenue>333300</Revenue>
      <Date>21/6/2011</Date>
      <Desc>desc text...</Desc>
      <NumValue value="56"/>
      <NumValue value="56"/>
      <NumValue value="56"/>
      <NumValue value="56"/>
      <NumValue value="56"/>
      <NumValue value="56"/>
   </Detail>
   <Detail>
      <Revenue>333300</Revenue>
      <Date>21/6/2011</Date>
      <Desc>desc text...</Desc>
      <NumValue value="56"/>
      <NumValue value="56"/>
      <NumValue value="56"/>
      <NumValue value="56"/>
      <NumValue value="56"/>
      <NumValue value="56"/>
   </Detail>
</Root>

これにはカーソルを使用したくありません...最初のエントリは正常に完了しましたが、関連付けられたデータをマスターregテーブルMasterRegに挿入する方法がわかりません...DetailReg

両方のテーブルには、最初はデータがありません。

4

1 に答える 1

1

誰があなたに投票したかはわかりませんが、あなたの質問には 2 つのメリットがあります。(1) XML データ構造を処理すること、(2) カーソルに頼らずにマスターと子の挿入を処理することです。

これは次のような方に最適な仕事ですMERGE:

SET DATEFORMAT DMY -- Your server may not need this
DECLARE @XMLString xml = '<!-- your xml goes here --!>'
DECLARE @InsertResult TABLE
(
    MasterID    int,
    NumValueXML xml
)

MERGE MasterReg
    USING   (
                SELECT  Detail.value('Revenue[1]','int')        AS Revenue,
                        Detail.value('Date[1]','date')          AS [Date],
                        Detail.value('Desc[1]','varchar(200)')  AS [Desc],
                        Detail.query('NumValue')                AS NumValueXML
                FROM    @XMLString.nodes('/Root/Detail') tmp(Detail)
            ) AS src
    ON      0 = 1
    WHEN NOT MATCHED THEN
            INSERT (Revenue, [Date], [Desc])
            VALUES (src.Revenue, src.[Date], src.[Desc])
    OUTPUT  inserted.MasterID, src.NumValueXML
    INTO    @InsertResult (MasterID, NumValueXML)
;

INSERT INTO DetailReg (MasterID, NumValue)
    SELECT      t1.MasterID,
                t2.x.value('@value','int')
    FROM        @InsertResult                    t1
    CROSS APPLY t1.NumValueXML.nodes('NumValue') t2(x)

SELECT * FROM MasterReg
SELECT * FROM DetailReg

クエリを理解するのに助けが必要な場合は、コメントでお知らせください。

于 2014-10-01T16:52:50.560 に答える