代码之家  ›  专栏  ›  技术社区  ›  Mateen Bagheri

如何检索INSERT INTO〔table〕SELECT〔col1,…〕中完成的所有插入的SCOPE_IDENTITY

  •  2
  • Mateen Bagheri  · 技术社区  · 2 年前

    假设我有一个带有一些列的临时表,其中一列专用于插入的Invoice的标识列,另一列用于插入Invoice数据本身。如下表所示:

    CREATE TABLE #InvoiceItems
    (
        RowNumber INT, -- Used for inserting new invoice
        SaleID INT,    -- Used for inserting new invoice
        BuyerID INT,   -- Used for inserting new invoice
        InvoiceID INT  -- Intended for PK of the invoice added after inserting it
    );
    

    我使用以下内容将数据插入发票表

    INSERT INTO [Invoice] 
        SELECT [col1, ...] 
        FROM #InvoiceItems
    

    我该如何实现填充 InvoiceID 列,同时使用临时表将表数据插入发票表?我知道 SCOPE_IDENTITY() 函数,但它只返回最后插入的PK,这并不真正适合我的需要。

    我也可以使用 while 一个接一个地这样做,但由于我计划插入的数据数量巨大,我觉得这不是最优化的选择。

    感谢您提前给出答案。

    2 回复  |  直到 2 年前
        1
  •  6
  •   Lukasz Szozda    2 年前

    获取多个 IDENTITY 值来自 INSERT INTO SELECT FROM OUTPUT 子句可以使用:

    -- temp table
    CREATE TABLE #temp(col VARCHAR(100));
    INSERT INTO #temp(col)  VALUES ('A'), ('B'), ('C');
    
    --target table
    CREATE TABLE tab(
      id INT IDENTITY,
      col VARCHAR(100)
    );
    

    主插件:

    INSERT INTO tab(col)
    OUTPUT inserted.id, inserted.col
    SELECT col
    FROM #temp;
    

    也可以使用将输出插入到另一个表中 OUTPUT INTO :

    CREATE TABLE #temp_identity(id INT);
    
    INSERT INTO tab(col)
    OUTPUT inserted.id
    INTO #temp_identity
    SELECT col
    FROM #temp;
    
    SELECT * FROM #temp_identity;
    

    db<>fiddle demo

        2
  •  1
  •   el B    2 年前
    CREATE TABLE #InvoiceItems(
        RowNumber INT, 
        SaleID INT,   
        BuyerID INT,   
        InvoiceID INT
    );
    
    INSERT INTO #InvoiceItems (RowNumber, SaleID, BuyerID) values (1, 55, 77)
    INSERT INTO #InvoiceItems (RowNumber, SaleID, BuyerID) values (1, 56, 78)
    INSERT INTO #InvoiceItems (RowNumber, SaleID, BuyerID) values (1, 57, 79)
    INSERT INTO #InvoiceItems (RowNumber, SaleID, BuyerID) values (1, 58, 80)
    INSERT INTO #InvoiceItems (RowNumber, SaleID, BuyerID) values (1, 59, 81)
    
    
    DECLARE @Inserted table( RowNumber int,
                        SaleID INT,    
                        BuyerID INT,  
                        InvoiceID INT);
    
    INSERT INTO dbo.[Invoice] (RowNumber, SaleID, BuyerID) 
    OUTPUT  INSERTED.RowNumber, INSERTED.SaleID, INSERTED.BuyerID, INSERTED.InvoiceID
    INTO @Inserted
    SELECT RowNumber, SaleID, BuyerID 
    FROM #InvoiceItems
    
    UPDATE ii
    SET InvoiceID = ins.InvoiceID
    FROM #InvoiceItems ii 
    JOIN @Inserted ins on ins.BuyerID = ii.BuyerID and ins.RowNumber = ii.RowNumber and ins.SaleID = ii.SaleID
    
    SELECT * FROM #InvoiceItems