2010-11-02 3 views
2

Comment insérer des données dans 3 tableaux connexes (SQL Server)Insérer des données dans 3 tables liées

Par exemple, j'ai tables client < - Customer_Address -> Adresse Après avoir insérer des données dans et adresse du client, comment puis-je insérer les ID du client et de l'adresse dans Customer_Address? (joindre la table)

Merci!

Répondre

0

Si les ID des tables Customer et Address sont des colonnes Identity, vous pouvez stocker le nouvel ID dans une variable.

DECLARE @CustomerID int 

SELECT @CustomerID = @@IDENTITY FROM TABLE CUSTOMER 

Une syntaxe similaire pourrait être utilisée pour la table d'adresses. Ensuite, dans votre déclaration INSERT vous pouvez le faire:

INSERT INTO Customer_Address (CustomerID, AddressID) 
VALUES (@CustomerID, @AddressID) 
0

utiliser une transaction, et rappelez-vous l'identité. dans le serveur sql -

declare @CustomerId int 
declare @AddressId int 

begin tran 
    insert into Customer (blah, blah) values (blah, blah) 
    set @CustomerId = @@IDENTITY --assuming there are no triggers 
    insert into [Address] (blah, blah) values (blah, blah) 
    set @AddressId = @@IDENTITY  --once again, no triggers to mess up the @@IDENTITY 
    insert into CustomerAddress(CustomerId,AddressId) values (@CustomerId,@AddressId) 
commit 
3

Utilisez SCOPE_IDENTITY, @@ IDENTITY peut renvoyer une valeur de toute portée:

DECLARE @CustomerId INT 
DECLARE @AddressId INT 

BEGIN TRANSACTION 

    INSERT INTO CUSTOMER (blah, blah) values (blah, blah) 
    SET @CustomerId = SCOPE_IDENTITY 

    INSERT INTO ADDRESS (blah, blah) values (blah, blah) 
    SET @AddressId = SCOPE_IDENTITY 

    INSERT INTO CUSTOMERADDRESS (CustomerId,AddressId) values (@CustomerId,@AddressId) 

COMMIT TRANSACTION 
0

est une façon ici.

 
Declare CustomerID int, AddressID int

insert into Customer (list, of, fields) values (list, of, values) select @CustomerID=scope_Identity() insert into Address (list, of, fields) values (list, of, values) select @AddressID =scope_Identity()

insert into Customer_Address (CustomerID, AddressID) values (@CustomerID, @AddressID)

0

Si elle est d'une application, pourquoi ne pas simplement utiliser LINQ, vous pouvez accomplir des choses comme ça en quelques minutes, d'une manière plus compression et plus cuisse au modèle de logique métier. Si ce n'est pas le je recommande fortement la transaction et la version SCOPE_IDENTITY, car si vous êtes dans un système lourdement chargé, une autre opération peut faire un insert et changer la valeur d'identité de sorte que vous vous retrouverez avec des données incohérentes.

1

Si vous souhaitez insérer plus d'une ligne, vous pouvez utiliser la clause de sortie:

declare @insertedAddresses table (OriginalID int, AddressID int); 
declare @insertedCustomers table (OriginalID int, CustomerID int); 

insert into dbo.Addresses (AddressData) 
output source.OriginalID, inserted.AddressID into @insertedAddresses 
select AddressData from source; 

insert into dbo.Customers (CustomerData) 
output source.OriginalID, inserted.CustomerID into @insertedCustomers 
select CustomerData from source; 

insert into dbo.Customer_Address (AddressID, CustomerID) 
select a.AddressID, c.CustomerID 
from @insertedAddresses a inner join @insertedCustomers c on c.OriginalID=a.OriginalID;