我有以下查询:
INSERT INTO dbo.Products
( Code ,
ProducerCode ,
CustomerId ,
EanCode ,
ChangedDateTime ,
ChangedById ,
Deleted
)
SELECT Code ,
ProducerCode ,
CustomerId ,
EanCode ,
GETDATE(),
GETDATE(),
0
FROM dbo.BulkProducts
WHERE ProductId is NULL AND BulkProducts.BulkId = @BulkId
Products
表格有一个IDENTITY ID
列,该列在插入时自动分配。我想要实现的是,在Products
中插入后,ID
行中的产品已分配BulkProducts
。我已经阅读了一些关于@@IDENTITY
,IDENT_CURRENT
和SCOPE_IDENTITY
的内容,但我似乎无法将其用于我的示例。任何帮助赞赏。我正在使用SQL Server 2012。
答案 0 :(得分:0)
你可以使用Output
子句来实现它,就像这样 -
DECLARE @OutProduct TABLE
(
ProductID INT,
Code INT
)
INSERT INTO dbo.Products
( Code ,
ProducerCode ,
CustomerId ,
EanCode ,
ChangedDateTime ,
ChangedById ,
Deleted
)
OUTPUT INSERTED.ID, INSERTED.Code INTO @OutProduct (ProductID, Code)
SELECT Code ,
ProducerCode ,
CustomerId ,
EanCode ,
GETDATE(),
GETDATE(),
0
FROM dbo.BulkProducts
WHERE ProductId is NULL AND BulkProducts.BulkId = @BulkId
所以现在所有插入的数据都在@OutProduct
表中。现在,您可以使用下面的临时表更新BulkProducts表。
UPDATE bprod
SET productID = tmp.ProductID
FROM BulkProducts bprod
INNER JOIN @OutProduct tmp
ON bprod.Code = tmp.Code
WHERE bprod.ProductId is NULL AND bprod.BulkId = @BulkId
答案 1 :(得分:0)
显然,没有MERGE
就无法解决这个问题。最终解决方案如下所示:
MERGE INTO dbo.Products
USING dbo.BulkProducts AS src
ON 1 = 0 -- Never match
WHEN NOT MATCHED THEN
INSERT(EanCode, ChangedDateTime, ChangedById, Deleted)
VALUES(src.EanCode, GETDATE(), GETDATE(), 0)
OUTPUT
inserted.Id,
src.Id
INTO @OutProduct;
就像这样,我的@OutProduct
表包含BulkProductId
和ProductId
的元组,然后我可以使用它来更新我的BulkProducts
表。