2017-08-30 109 views
1

的数据库是SQL Server 2012的获取一个排的有序ID是一个行的另一个表的外键在一个查询

我应该添加了一堆行对从两个表Excel文件。

我有表Customers

id | firstname | lastname 
1 | John  | Doe 
etc. 

Customers表有一个序列customers_seq使用IDS的新行。因为在插入时行数量是未知的。具体如下:

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 rows-添加一行相同的查询在表Services之后,每行添加到表Customers之后,那么序列生成的id对于Customers行将成为添加到行上的列fk_Customers的值该Services表。

我想它可能使用T-SQL局部变量是可能的。

所以,像这样:

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); 

有没有更好的方式来做到这一点?

回答

1

当然,使用output clauseinserted部分让所有的人在一次:

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'); 

我的例子不使用序列,但它会工作方式相同。请注意,这将会为updatedelete以及工作;甚至可以同时使用deletedinserted得到新旧值在一个镜头:

update a 
    set a.FirstName = Convert(nvarchar(100), NewId()) 
output deleted.FirstName as OldFirstName 
    , inserted.FirstName as NewFirstName 
from @customers as a; 
相关问题