2017-08-30 60 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; 
相關問題