2017-08-30 3 views
1
in einer Abfrage der Fremdschlüssel einer Zeile sein

Die Datenbank ist SQL Server 2012.die sequenzierte id einer Reihe bekommt in einer anderen Tabelle

ich sollte ein paar Zeilen auf zwei Tabellen aus einem hinzufügen Excel-Datei.

Ich habe den Tisch Customers:

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

Die Customers Tabelle hat eine Sequenz customers_seq für IDs für neue Zeilen zu verwenden. Denn zum Zeitpunkt des Einfügens ist die Anzahl der Zeilen nicht bekannt. Wie folgt:

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

Dies funktioniert wie vorgesehen.

Ich habe auch die Tabelle Services

id | name | fk_Customers 
1 | lunch| 2 
etc. 

Nun, hier ist das Problem:

ich soll - in derselben Abfrage, wo ich die Customers rows- fügen Sie eine Zeile hinzufügen auf der Tabelle Services nach jeder Zeile hinzugefügt, um die Tabelle Customers so, dass die Sequenz generiert id für die Customers Zeile würde der Wert für die Spalte fk_Customers in der Zeile, die hinzugefügt wird die Services Tabelle.

Ich dachte, es wäre möglich, mithilfe der lokalen TSQL-Variablen möglich.

Also, so etwas wie:

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

Gibt es einen besseren Weg, dies zu tun?

Antwort

1

sicher, verwenden Sie den inserted Teil des output clause alle von ihnen zu bekommen auf einmal:

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

Mein Beispiel keine Sequenz verwenden, aber es wird auf die gleiche Weise zu arbeiten. Beachten Sie, dass dies auch für einen update oder delete funktioniert; man kann sogar die alten und neuen Werte in einem Schuss unter Verwendung sowohl als auch

update a 
    set a.FirstName = Convert(nvarchar(100), NewId()) 
output deleted.FirstName as OldFirstName 
    , inserted.FirstName as NewFirstName 
from @customers as a; 
erhalten
Verwandte Themen