1

我有两张桌子:

  • MasterReg(MasterID、Revenue、Date、Desc); 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有六个(一个条目中有六个条目)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>

我不想为此使用游标...第一个MasterReg条目成功完成,但我不知道如何将关联数据插入到DetailReg主 reg 表中...

这两个表最初都没有任何数据。

4

1 回答 1

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

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

于 2014-10-01T16:52:50.560 回答