假设我有一个带有一些列的临时表,其中一个列专门用于插入发票的标识列,其他列用于插入发票数据本身。如下表:
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,这并不真正适合我的需要。
InvoiceID
SCOPE_IDENTITY()
我也可以使用 a 一个一个while地执行此操作,但由于我计划插入的数据数量巨大,我觉得它不会是最优化的选项。
while
感谢您提前回答。
可以使用从子句中获取多个IDENTITY值:INSERT INTO SELECT FROM OUTPUT
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:
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