SQL在主表中插入数据,然后在详细信息表中引用数据

时间:2014-10-01 15:58:13

标签: sql-server xml database sql-server-openxml

我有两张桌子:

  • MasterReg(MasterID,Revenue,Date,Desc); MasterIDIdentity

  • DetailReg(DetailID,MasterID,NumValue); DetailIDIdentity

我正在尝试使用openxml

从xml字符串插入数据
insert into MasterReg (Revenue, Date, Desc) 
   Select Revenue, Date, Desc 
  From OPENXML(....

这将在我的MasterReg

中插入5行

DetailReg表包含插入MasterReg

中的每个值的6行

e.g。对于MasterID=1DetailID表格中会有六个DetailReg(一个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 个答案:

答案 0 :(得分: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

如果您需要帮助了解查询,请在评论中告诉我。