请考虑以下事项:
CREATE TABLE A
(
Id int IDENTITY(1,1) NOT NULL,
Id2 int NULL,
Name varchar(50)
)
CREATE TABLE B
(
Id int NULL,
Name varchar(50)
)
INSERT INTO B (Id, Name)
VALUES
(100, 'val1'),
(200, 'val2'),
(NULL, 'val3'),
(NULL, 'val4')
INSERT INTO A
(Id2, Name)
SELECT Id, Name FROM B
UPDATE A SET Id2 = Id + 100000 WHERE Id2 IS NULL
在INSERT之后有没有办法避免UPDATE?也就是说,有没有办法知道标识值是什么,并在插入过程中引用它?
答案 0 :(得分:0)
您可以使用instead of insert
触发器
create trigger trg_test on A instead of insert
as begin
INSERT INTO A (name,id2)
SELECT INSERTED.name,
case when INSERTED.id2 is null then 10000 else INSERTED.id2 end
as super_id from INSERTED;
end
您也可以使用AFTER INSERT
触发器和UPDATE
记录,如
create trigger trg_test on A after insert
as begin
UPDATE a
SET id2 = i.Id + 100000
FROM A a
INNER JOIN INSERTED i
ON (i.Id = a.Id)
WHERE a.id2 is null;
end
因此,每个记录插入触发器都将触发并更新记录。因此,在Insert
查询完成后,结果将如下所示。 See more about Triggers
1 100 val1
2 200 val2
3 100003 val3
4 100004 val4
另一种没有任何触发器的方法,使用如下的临时表。
CREATE TABLE #temp1
(
Id int IDENTITY(1,1) NOT NULL,
Id2 int NULL,
Name varchar(50)
);
insert into #temp1(id2,name)
select id,name from B
UPDATE a
SET id2 = i.Id + 100000
FROM A a
INNER JOIN #temp1 i
ON (i.Id = a.Id)
WHERE a.id2 is null;
答案 1 :(得分:0)
您可以使用OUTPUT子句查找已添加到表中的标识值:
DECLARE @newkeys TABLE (PrimaryKeyValue int)
INSERT INTO A
(
Name, Id2
)
OUTPUT INSERTED.IDENTITYCOL INTO @newkeys
SELECT Name, Id FROM B
但是你仍然需要更新表作为第二步 - 在INSERT批处理完成之前,身份值不可用。