2013-01-02 4 views
0

J'insère des données d'une table dans plusieurs autres. Le premier insert va créer un nouvel ID utilisateur. Ce nouvel ID utilisateur sera utilisé dans les insertions suivantes. Je continuerai également à insérer le nom d'utilisateur de la table source dans d'autres tables. La chaîne d'inserts ci-dessous est pour un utilisateur. Il y aura probablement 2000 utilisateurs impliqués. Je suis familier avec la façon dont cela peut être fait en utilisant un curseur. Y a-t-il un autre moyen de faire cette chaîne d'inserts sans un curseur?Comment regrouper plusieurs INSERT?

insert into table 1 using @username and @firstname from source table 

insert into table 2 using userid generated from table 1 (userid1) 

insert into table 3 using @username and userid1 

insert into table 4 using userid1 
+1

Vous pouvez utiliser la clause de sortie (http://msdn.microsoft.com/en-gb/library/ms177564(v=sql.100). aspx) pour capturer les identifiants en vrac, si vous pouvez organiser vos inserts dans un ensemble comme la mode. – Laurence

+0

Je connais la clause de sortie. Avez-vous un exemple de ce que vous entendez par définir comme la mode? – 4thSpace

+1

http://sqlfiddle.com/#!3/89ab3/1 – Laurence

Répondre

1

Vous pouvez utiliser le Output Clause d'une instruction d'insertion pour capturer Ids produit en vrac.

Par exemple:

Create Table dbo.Source (
    FirstName nvarchar(100), 
    LastName nvarchar(100) 
); 

Create Table dbo.Attrs (
    Id int Identity Not Null Primary Key, 
    Name nvarchar(100) Not Null, 
    DefaultVal nvarchar(100) 
); 

Create Table dbo.Table1 (
    Id Int Identity Not Null Primary Key, 
    FirstName nvarchar(100), 
    LastName nvarchar(100) 
); 

Create Table dbo.Table2 (
    Id int Identity Not Null Primary Key, 
    Table1ID int Not Null Foreign Key References dbo.Table1 (Id), 
    AttrId int Not Null Foreign Key References dbo.Attrs (Id) 
); 

Insert Into dbo.Source Values 
    (N'Mickey', N'Mouse'), 
    (N'Donald', N'Duck'), 
    (N'Goofy', Null); 

Insert Into dbo.Attrs Values 
    ('Size', 'Small'), 
    ('Wings', 'No'); 

Declare @Temp1 Table (Id Int, FirstName nvarchar(100), LastName nvarchar(100)) 
Declare @Temp2 Table (Id int, Table1ID int, AttrId int) 

Insert Into dbo.Table1 
    (FirstName, LastName) 
Output 
    inserted.Id, inserted.FirstName, inserted.LastName 
Into 
    @Temp1 
Select 
    FirstName, LastName 
From 
    dbo.Source 


Insert Into dbo.Table2 
    (Table1ID, AttrId) 
Output 
    inserted.Id, Inserted.Table1ID, Inserted.AttrID 
Into 
    @Temp2 
Select 
    t.Id, 
    a.Id 
From 
    @Temp1 t 
    Cross Join 
    dbo.Attrs a 

Select * From @Temp2 

http://sqlfiddle.com/#!3/31110/3

+0

Merci. Une question de suivi si vous êtes intéressé: http://stackoverflow.com/questions/14143750/how-to-supply-values-to-sproc-from-table. – 4thSpace

Questions connexes