我有一种情况需要将查询中的一些值插入到具有标识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。
任何可能导致解决方案的想法?
答案 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中的值已经知道了吗?