一尘不染

如何检索在 INSERT INTO [table] SELECT [col1, ...] [duplicate] 中完成的所有插入的 SCOPE_IDENTITY

sql

假设我有一个带有一些列的临时表,其中一个列专门用于插入发票的标识列,其他列用于插入发票数据本身。如下表:

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
);

我使用类似以下的方法将数据插入 Invoice 表

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

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

我也可以使用 a 一个一个while地执行此操作,但由于我计划插入的数据数量巨大,我觉得它不会是最优化的选项。

感谢您提前回答。


阅读 106

收藏
2022-07-21

共1个答案

一尘不染

可以使用从子句中获取多个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;

dbfiddle

2022-07-21