2014-10-01 43 views
1

我有兩個表:SQL插入在主表中的數據,然後引用數據詳細表

  • MasterReg(MasterID,收入,日期,商品說明); MasterIDIdentity

  • DetailReg(DetailID,MasterID,NumValue); DetailIDIdentity

我試圖使用OPENXML

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

這將在我的MasterReg表中插入5行插入從XML字符串數據

DetailReg表包含6行了每個值插入MasterReg

例如爲MasterID=1將有6 DetailIDDetailReg表(六則在DetailReg一個Master條目)

我的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> 

我不想使用光標這一個.. 。第一個MasterReg條目已成功完成,但我不知道如何將相關數據插入帶有主註冊表的DetailReg ...

兩個表最初都沒有任何數據。

回答

1

我不知道是誰投票給你,但你的問題有兩個優點:(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 

讓我知道在評論,如果您需要幫助理解查詢。

+0

謝謝..它效果很好。 – 2014-10-08 17:11:19

相關問題