作为序言,我对T-SQL语法知之甚少。
我想创建一个简单的SQL脚本,它将生成3个插入语句。
Insert A
Insert B
Insert C
在插入B语句中插入一个语句的标识或“ID”。 两个身份插入A&插入C语句中需要B。
伪代码看起来像:
INSERT INTO tableA
VALUES ('blah', 'blah')
INSERT INTO tableB
VALUES (IDENTITY_FROM_A_INSERT, 'foo')
INSERT INTO tableC
VALUES (IDENTITY_FROM_A_INSERT, IDENTITY_FROM_B_INSERT)
我将如何编写此脚本?
答案 0 :(得分:19)
每次插入后使用SCOPE_IDENTITY()
以获取插入行的标识(在当前会话中)。
我使用了两个变量来捕获这两个身份,然后将它们插入到第三个表中:
DECLARE @Id1 INT
DECLARE @Id2 INT
INSERT INTO tableA VALUES ('blah', 'blah')
SET @Id1 = SELECT SCOPE_IDENTITY()
INSERT INTO tableB VALUES (IDENTITY_FROM_A_INSERT, 'foo')
SET @Id2 = SELECT SCOPE_IDENTITY()
INSERT INTO tableC VALUES (@Id1, @Id2)
答案 1 :(得分:2)
scope_identity()
非常适合单记录插入的整数标识符(+1到the other answer btw)。但是,如果您发现自己使用guid / uniqueidentifier(newsequentialid()
,newid()
等)或一次插入多条记录,则需要一些不同的内容:
declare @id uniqueidentifier;
-- Table variable for storing your newly inserted identifiers:
declare @NewlyInsertedIds table
(
[Id] uniqueidentifier
);
insert [MyTable]
(
[Blah1]
,[Blah2]
)
-- in the output clause you can access the inserted/deleted pseudo tables:
ouptut inserted.[Id]
into @NewlyInsertedIDs
(
[Id]
)
values
(
'Blah'
,'Blah'
);
select
@id = [Id]
from @NewlyInsertedIds;
查看the OUTPUT Clause了解详情。