有没有办法在INSERT SELECT中检索插入的标识以及查询中的某些值?

时间:2016-11-21 13:21:04

标签: sql-server sql-server-2008 tsql

我有一种情况需要将查询中的一些值插入到具有标识PK的表中。对于某些记录,我还需要在另一个具有1对1(部分)关系的表中插入值:

CREATE TABLE A (
    Id int identity primary key clustered, 
    Somevalue varchar(100),
    SomeOtherValue int)

CREATE TABLE B (Id int primary key clustered,
    SomeFlag bit)

DECLARE @inserted TABLE(NewId int, OldId)

INSERT INTO A (Somevalue) 
OUTPUT Inserted.Id into @inserted(NewId)
SELECT SomeValue
FROM A
WHERE <certain condition>

INSERT INTO B (Id, SomeFlag)
SELECT 
i.NewId, B.SomeFlag
FROM @inserted i
JOIN A ON <some condition>
JOIN B ON A.Id = B.Id

问题是第一个INSERT / SELECT中来自A的查询返回的记录只能由Id区分,我无法插入。不幸的是我无法更改A表的结构,插入可以解决我问题的“上一个”ID。

任何可能导致解决方案的想法?

2 个答案:

答案 0 :(得分:2)

使用INSERT ... OUTPUT ... SELECT ...,您无法输出不在目标表中的列。您可以尝试使用MERGE

MERGE INTO A as tgt
    USING   (SELECT Id, SomeValue FROM A WHERE <your conditions>) AS src
    ON      0 = 1
    WHEN NOT MATCHED THEN
            INSERT (SomeValue)
            VALUES (src.SomeValue)
            OUTPUT (inserted.Id, src.Id) -- this is your new Id / old Id mapping
            INTO    @inserted
;

答案 1 :(得分:0)

SCOPE_IDENTITY()返回当前会话和当前范围生成的最后一个标识值。您可以将其粘贴到#table中并使用它插入B

SELECT SCOPE_IDENTITY() as newid into #c

但是,你的INSERT INTO B加入条件对我来说意味着B中的值已经知道了吗?