Sql server 在一个查询中将行的序列id作为另一个表中行的外键

Sql server 在一个查询中将行的序列id作为另一个表中行的外键,sql-server,local-variables,tsql-sequence,Sql Server,Local Variables,Tsql Sequence,数据库是SQL Server 2012 我应该在Excel文件的两个表上添加一组行 我有表客户: id | firstname | lastname 1 | John | Doe etc. Customers表有一个序列Customers\u seq用于新行的ID。因为在插入时,行的数量是未知的。详情如下: insert into Customers (id,firstname,lastname) values (next value for custome

数据库是SQL Server 2012

我应该在Excel文件的两个表上添加一组行

我有表
客户

id | firstname | lastname
1  | John      | Doe
etc.
Customers
表有一个序列
Customers\u 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 --
这正是我们想要的

我还有表
Services

id | name | fk_Customers
1  | lunch| 2
etc.
现在,问题来了:

在我添加
Customers
行的同一个查询中,我应该在表
Services
的每一行添加到表
Customers
之后添加一行,为
Customers
行生成的
id
序列将成为添加到
Services
表的行上
fk_Customers
列的值

我认为使用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);

有更好的方法吗?

当然可以,使用的
插入部分可以一次获取所有内容:

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 a
   set a.FirstName = Convert(nvarchar(100), NewId())
output deleted.FirstName as OldFirstName
     , inserted.FirstName as NewFirstName
from @customers as a;