更新具有插入的标识ID的表行

时间:2016-05-19 13:08:47

标签: sql sql-server tsql

我有以下查询:

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。我已经阅读了一些关于@@IDENTITYIDENT_CURRENTSCOPE_IDENTITY的内容,但我似乎无法将其用于我的示例。任何帮助赞赏。我正在使用SQL Server 2012。

2 个答案:

答案 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表包含BulkProductIdProductId的元组,然后我可以使用它来更新我的BulkProducts表。