如何使用合并语句在不更改项目顺序的情况下将批量数据插入 table

How to insert bulk data without changing order of item into table using merge statement

我编写了一个存储过程,可以使用 merge 语句将批量数据插入 table。

问题是,当我按顺序插入 itemid 1024,1000,1012,1025 时,SQL 服务器会自动更改 itemid 1000,1012,1024,1025 的顺序。

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

这是示例代码。这会将 XML 字符串解析为 table 对象:

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 table:

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;   

SQL table 中的行没有任何顺序。除非您指定 order by.

,否则它们会以不确定的顺序返回

尝试向您的临时文件添加标识列table?

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

标识列可能会捕获 XML 个元素的顺序。

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

如其他地方所述,table 中的数据存储为无序集。如果您需要能够在插入数据后返回到 table 并确定插入的顺序,则必须向 table 架构添加一列来记录该信息。

它可以像添加一个 IDENTITY 列一样简单,该列将在每行添加时递增,或者可能是一个具有 DATETIME 数据类型和 GETDATE() 默认值的列值,这样您不仅可以知道添加了订单行,还可以知道添加的确切时间。