在一个查询中获取一行的有序 id 作为另一个 table 中一行的外键
Getting the sequenced id of a row to be the foreign key of a row in another table in one query
数据库是SQL Server 2012。
我应该在 Excel 文件的两个 table 上添加一堆行。
我有 table Customers
:
id | firstname | lastname
1 | John | Doe
etc.
Customers
table 有一个序列 customers_seq
用于新行的 ID。因为在插入时行数是未知的。如下:
insert into Customers (id,firstname,lastname)
values
(next value for customers_seq, '2016-001', 'John', 'Doe'),
(next value for customers_seq, '2016-002', 'Jane', 'Doe'),
(next value for customers_seq, '2016-003', 'Steve', 'Waters');
-- tons of more customers --
这按预期工作。
我还有tableServices
id | name | fk_Customers
1 | lunch| 2
etc.
现在,问题来了:
我应该 - 在我添加 Customers
行的同一个查询中 - 在 table Services
上的每一行添加到 table Customers
因此,Customers
行的序列生成的 id
将成为添加到 [=] 行上的列 fk_Customers
的值18=] table.
我想通过使用 TSQL 局部变量可能是可能的。
所以,类似于:
DECLARE @sequenceCreatedId bigint;
SET @sequenceCreatedId = next value for customers_seq;
insert into Customers (id,firstname,lastname)
values(@sequenceCreatedId, '2016-001', 'John', 'Doe')
insert into Services (id,name,fk_Customers)
values(next value for services_seq, someName, @sequenceCreatedId);
--And just repeat that whole thing. Setting that variable again and again--
SET @sequenceCreatedId = next value for customers_seq;
insert into Customers (id,firstname,lastname)
values(@sequenceCreatedId, '2016-002', 'Jane', 'Doe')
insert into Services (id,name,fk_Customers)
values(next value for services_seq, anotherName, @sequenceCreatedId);
有更好的方法吗?
当然,使用 output clause 的 inserted
部分一次获取所有这些:
declare @customers table (
id int not null identity(0, 1)
, firstname nvarchar(100) not null
, lastname nvarchar(100) not null
);
insert into @customers (firstname, lastname)
output inserted.*
values ('John', 'Doe')
, ('Jane', 'Doe')
, ('Steve', 'Waters');
我的示例不使用序列,但它的工作方式相同。请注意,这也适用于 update
或 delete
;甚至可以同时使用 deleted
和 inserted
:
一次获得旧值和新值
update a
set a.FirstName = Convert(nvarchar(100), NewId())
output deleted.FirstName as OldFirstName
, inserted.FirstName as NewFirstName
from @customers as a;
数据库是SQL Server 2012。
我应该在 Excel 文件的两个 table 上添加一堆行。
我有 table Customers
:
id | firstname | lastname
1 | John | Doe
etc.
Customers
table 有一个序列 customers_seq
用于新行的 ID。因为在插入时行数是未知的。如下:
insert into Customers (id,firstname,lastname)
values
(next value for customers_seq, '2016-001', 'John', 'Doe'),
(next value for customers_seq, '2016-002', 'Jane', 'Doe'),
(next value for customers_seq, '2016-003', 'Steve', 'Waters');
-- tons of more customers --
这按预期工作。
我还有tableServices
id | name | fk_Customers
1 | lunch| 2
etc.
现在,问题来了:
我应该 - 在我添加 Customers
行的同一个查询中 - 在 table Services
上的每一行添加到 table Customers
因此,Customers
行的序列生成的 id
将成为添加到 [=] 行上的列 fk_Customers
的值18=] table.
我想通过使用 TSQL 局部变量可能是可能的。
所以,类似于:
DECLARE @sequenceCreatedId bigint;
SET @sequenceCreatedId = next value for customers_seq;
insert into Customers (id,firstname,lastname)
values(@sequenceCreatedId, '2016-001', 'John', 'Doe')
insert into Services (id,name,fk_Customers)
values(next value for services_seq, someName, @sequenceCreatedId);
--And just repeat that whole thing. Setting that variable again and again--
SET @sequenceCreatedId = next value for customers_seq;
insert into Customers (id,firstname,lastname)
values(@sequenceCreatedId, '2016-002', 'Jane', 'Doe')
insert into Services (id,name,fk_Customers)
values(next value for services_seq, anotherName, @sequenceCreatedId);
有更好的方法吗?
当然,使用 output clause 的 inserted
部分一次获取所有这些:
declare @customers table (
id int not null identity(0, 1)
, firstname nvarchar(100) not null
, lastname nvarchar(100) not null
);
insert into @customers (firstname, lastname)
output inserted.*
values ('John', 'Doe')
, ('Jane', 'Doe')
, ('Steve', 'Waters');
我的示例不使用序列,但它的工作方式相同。请注意,这也适用于 update
或 delete
;甚至可以同时使用 deleted
和 inserted
:
update a
set a.FirstName = Convert(nvarchar(100), NewId())
output deleted.FirstName as OldFirstName
, inserted.FirstName as NewFirstName
from @customers as a;