2010-05-13 14 views
0

Disons que j'ai une table (tout est très simplifié):insérer des données dans plusieurs tables

create table OriginalData (
ItemName NVARCHAR(255) not null 
    ) 

Et je voudrais insérer ses données (jeu à base!) En deux tableaux qui l'héritage du modèle

create table Statements (
     Id int IDENTITY NOT NULL, 
ProposalDateTime DATETIME null 
    ) 

create table Items (
     StatementFk INT not null, 
     ItemName NVARCHAR(255) null, 
     primary key (StatementFk) 
    ) 

Les instructions sont la table parente et Items est la table enfant. Je n'ai aucun problème à le faire avec une ligne qui implique l'utilisation de IDENT_CURRENT mais je n'ai aucune idée de comment faire cet ensemble basé (c'est-à-dire entrer plusieurs lignes dans les deux tables).

Merci.

Meilleurs voeux,

Christian

+2

Je n'ai aucune idée ce que vous essayez de faire. Comment les colonnes dans OriginalData correspondent-elles aux tables Statements et Items ??? –

+0

désolé KM Je l'ai édité - devrait faire sens maintenant. – cs0815

+0

BTW n'utilise jamais ident_current il va donner la lastidentity insérée qui ne peut pas être la vôtre, nous avons eu un dévit totalement l'intégrité des données en l'utilisant lorsque deux utilisateurs différents ont été insérés en même temps. – HLGEM

Répondre

1

Une autre méthode qui empêcheraient l'utilisation des curseurs, qui est généralement pas une meilleure La pratique pour SQL est listée ci-dessous ... Elle utilise la clause OUTPUT pour capturer les résultats d'insertion de la table à utiliser dans l'insert vers la seconde table. Notez que cet exemple fait une hypothèse dans le fait que j'ai déplacé votre colonne IDENTITY à la table Items. Je crois que ce serait acceptable, au moins en fonction de la disposition de votre table d'origine, puisque la clé primaire de cette table est la colonne StatementFK.

Notez ce code exemple a été testé via SQL 2005 ...


IF OBJECT_ID('tempdb..#OriginalData') IS NOT NULL 
    DROP TABLE #OriginalData 
IF OBJECT_ID('tempdb..#Statements') IS NOT NULL 
    DROP TABLE #Statements 
IF OBJECT_ID('tempdb..#Items') IS NOT NULL 
    DROP TABLE #Items 

create table #OriginalData 
(ItemName NVARCHAR(255) not null) 

create table #Statements 
(Id int NOT NULL, 
    ProposalDateTime DATETIME null) 

create table #Items 
(StatementFk INT IDENTITY not null, 
    ItemName NVARCHAR(255) null, 
    primary key (StatementFk)) 

INSERT INTO #OriginalData 
    (ItemName ) 
      SELECT 'Shirt' 
UNION ALL SELECT 'Pants' 
UNION ALL SELECT 'Socks' 
UNION ALL SELECT 'Shoes' 
UNION ALL SELECT 'Hat' 

DECLARE @myTableVar table 
    (StatementFk int, 
    ItemName nvarchar(255)) 

INSERT INTO #Items 
    (ItemName ) 
OUTPUT INSERTED.StatementFk, INSERTED.ItemName 
INTO @myTableVar 
SELECT ItemName 
FROM #OriginalData 

INSERT INTO #Statements 
    (ID, ProposalDateTime ) 
SELECT 
    StatementFK, getdate() 
FROM @myTableVar 
+0

OUTPUT est le mathod préféré si vous utilisez l'aversion de SQL Server qui peut l'utiliser. – HLGEM

0

Vous aurez besoin d'écrire un processus ETL pour le faire. Vous voudrez peut-être regarder dans SSIS.

Cela peut également être fait avec t-sql et éventuellement des tables temporaires. Vous devrez peut-être stocker une clé unique à partir d'OriginalTable dans la table Statements, puis lorsque vous insérerez des éléments - joignez OriginalTable avec Statements sur cette clé unique pour obtenir l'ID.

0

Je ne pense pas que vous pouvez le faire en un seul morceau mais vous pouvez certainement le faire avec une boucle de curseur

DECLARE @bla char(10) 
DECLARE @ID int 

DECLARE c1 CURSOR 
FOR 
SELECT bla 
FROM OriginalData 

OPEN c1 

FETCH NEXT FROM c1 
INTO @bla 

WHILE @@FETCH_STATUS = 0 
BEGIN 

    INSERT INTO Statements(ProposalDateTime) VALUES('SomeDate') 
     SET @ID = SCOPE_IDENTITY() 
     INSERT INTO Items(StateMentFK,ItemNAme) VALUES(@ID,@bla) 
    FETCH NEXT FROM c1 
    INTO @bla 

END 

CLOSE c1 
DEALLOCATE c1 
+0

Merci cela semble bien fonctionner - n'ont pas utilisé les curseurs pendant un certain temps – cs0815

Questions connexes