代码之家  ›  专栏  ›  技术社区  ›  Manish Vadher

如何使用merge语句在不更改项顺序的情况下插入批量数据

  •  1
  • Manish Vadher  · 技术社区  · 7 年前

    merge

    问题是,当我按此顺序插入itemid 1024100010121025时,SQL Server会自动更改itemid 1000101210241025的顺序。

    我想插入我实际传递的数据。

    下面是示例代码。这将把XML字符串解析为表对象:

    DECLARE @tblPurchase TABLE
                (
                  Purchase_Detail_ID INT ,
                  Purchase_ID INT ,
                  Head_ID INT ,
                  Item_ID INT 
                );
    
    
    INSERT INTO @tblPurchase (Purchase_Detail_ID, Purchase_ID, Head_ID, Item_ID)
        SELECT  
            Tbl.Col.value('Purchase_Detail_ID[1]', 'INT') AS Purchase_Detail_ID,
            Tbl.Col.value('Purchase_ID[1]', 'INT') AS Purchase_ID,
            Tbl.Col.value('Head_ID[1]', 'INT') AS Head_ID,
            Tbl.Col.value('Item_ID[1]', 'INT') AS Item_ID 
        FROM    
            @PurchaseDetailsXML.nodes('/documentelement/TRN_Purchase_Details') Tbl(Col) 
    

    TRN_Purchase_Details 表:

    MERGE TRN_Purchase_Details MTD
    USING (SELECT    
               Purchase_Detail_ID,
               Id AS Purchase_ID,
               Head_ID, Item_ID 
           FROM      
               @tblPurchase
           LEFT JOIN 
               @ChangeResult ON 1 = 1) AS TMTD ON MTD.Purchase_Detail_ID = TMTD.Purchase_Detail_ID
                                               AND MTD.Purchase_ID = TMTD.Purchase_ID
    
    WHEN MATCHED THEN
        UPDATE SET MTD.Head_ID = TMTD.Head_ID,
                   MTD.Item_ID = TMTD.Item_ID 
    
    WHEN NOT MATCHED BY TARGET THEN
        INSERT (Purchase_ID, Head_ID, Item_ID)
        VALUES (Purchase_ID, Head_ID, Item_ID)
    
    WHEN NOT MATCHED BY SOURCE AND       
         MTD.Purchase_ID = (SELECT TOP 1 Id
                            FROM @ChangeResult
                            WHERE Id > 0) THEN
        DELETE;   
    
    2 回复  |  直到 7 年前
        1
  •  4
  •   Andomar    7 年前

    SQL表中的行没有任何顺序。它们以不确定的顺序返回,除非您指定 order by

    是否尝试向临时表中添加标识列?

    DECLARE @tblPurchase TABLE
            (
              ID int identity,
              Purchase_Detail_ID INT ,
    

    identity列可能捕获XML元素的顺序。

    如果这不起作用,你可以 calculate the position of the elements in the XML 并将该位置存储在临时表中。

        2
  •  0
  •   Eric Brandt    7 年前

    可以是添加一个 IDENTITY DATETIME GETDATE() 默认值,这样您不仅可以知道添加了订单行,还可以知道添加的确切时间。