2012-04-25 16 views
1

にツリー状の構造で多くの行を挿入する私はかなりこのSQL Server 2005の

A   B   C 
ID_A   ID_B  ID_C 
Name   Name  Name 
      ID_A  ID_B 

あなたが見ることができるように、AがCにBとBにリンクされているものであり、似ているSQLでのいくつかのテーブルを持っています基本的にデータモデルを含むテーブル。今、私はそれらのテーブルに基づいて日付を作成できるようにする必要があります。たとえば、次のデータがある場合

A     B      C 
1 Name1   1 SubName1 1   1 SubSubName1 1 
2 Name2   2 SubName2 1   2 SubSubName2 1 
        3 SubName3 2   3 SubSubName3 2 
               4 SubSubName4 3 
               5 SubSubName5 3 

私は他のテーブルのこれらのテーブルの '内容'をコピーしたいと思います。もちろん、新しいテーブルに挿入するときに生成される自動数値キーは、それらと私がトラック全体をコピーできるようにすることができるようにすることは難しいです。受取人テーブルの構造にはそれより多くの情報が含まれていますが、主に日付やその他のものがあります。

これは、TRANSACT-SQL(必要に応じて組み込み関数を使用)で完全に必要になります。これは可能ですか、誰かが私に短い例を教えてください。私は1つのレベルのためにそれをすることができますが、残りの部分は混乱します。

おかげ

EDIT:私の実際の図は、より多くのこのような

モデルのテーブルを探しますので、上記の情報は、単なる例です。テーブルとして、私はルックスを埋めるために必要

Processes -- (1-N) Steps -- (1-N) Task    -- (0-N) TaskCheckList 
         -- (0-N) StepsCheckLists 

このように

クライアントは既に存在し、 Oスクリプトを実行し、私は意志が意志はその手順が含まれているすべてのプロセス、taks、などが含まれている一つの配列を、作成...

+0

あなたは 'SET IDENTITY_INSERT [テーブル名] on'のと' SET IDENTITY_INSERT [テーブル名] OFF'であなたの 'INSERT'文を囲むことにより、独自のアイデンティティ値を挿入することができます。また、この構造は、自己参照の外部キーを持つ単一のテーブルに単純化することができ、セルフ・ジョインを使用してデータを再帰的に選択することができます。 –

+0

こんにちは、これはかなりシンプルに見えるかもしれませんが、これは例であるためです。実際のダイアグラムには6つのテーブルがあります。私は自分のアイデンティティを使うことができません。なぜなら、私は複数のコピーを作成できるからです。私はより多くの情報で自分の投稿を編集します。 –

+0

同じ問題の興味深い解決策がありますが、SQL Server 2008以上でのみ動作します:http://stackoverflow.com/questions/5365629 – Chad

答えて

0

[OK]を、

は、だから私は試行錯誤をたくさんやったし、ここで私が得たものです。最初は簡単だったようなものではかなり大きかったですが、うまく動作しているようです。

私たちのクライアントはフランス語であり、とにかく私たちはフランス語と英語で何とかしています。私は必要なすべてのテーブルにすべての日付を挿入します。これに残っている唯一のものは、いくつかのパラメータに従って挿入する日付を選択する必要がある最初の行ですが、これは簡単な部分です。

DECLARE @IdProcessusRenouvellement bigint 
DECLARE @NomProcessus nvarchar(255) 

SELECT @IdProcessusRenouvellement = ID FROM T_Ref_Processus WHERE Nom LIKE 'EXP%' 
SELECT @NomProcessus = Nom FROM T_Ref_Processus WHERE Nom LIKE 'EXP%' 

DECLARE @InsertedSequence table(ID bigint) 

DECLARE @Contrats table(ID bigint,IdClient bigint,NumeroContrat nvarchar(255)) 

INSERT INTO @Contrats SELECT ID,IdClient,NumeroContrat FROM T_ClientContrat 

DECLARE @InsertedIdsSeq as Table(ID bigint) 

-- Séquences de travail 
INSERT INTO T_ClientContratSequenceTravail(IdClientContrat,Nom,DateDebut) 
    OUTPUT Inserted.ID INTO @InsertedIdsSeq 
    SELECT ID, @NomProcessus + ' - ' + CONVERT(VARCHAR(10), GETDATE(), 120) + ' : ' +  NumeroContrat ,GETDATE() 
    FROM @Contrats 

-- Processus 
DECLARE @InsertedIdsPro as Table(ID bigint,IdProcessus bigint) 
INSERT INTO T_ClientContratProcessus 
     (IdClientContratSequenceTravail,IdProcessus,Nom,DateDebut,DelaiRappel,DateRappel,LienAvecPro cessusRenouvellement,IdStatutProcessus,IdResponsable,Sequence) 
    OUTPUT Inserted.ID,Inserted.IdProcessus INTO @InsertedIdsPro 
    SELECT  I.ID,P.ID,P.Nom,GETDATE(),P.DelaiRappel,GETDATE(),P.LienAvecProcessusRenouvellement,0,0,0 
     FROM @InsertedIdsSeq I, T_Ref_Processus P 
     WHERE P.ID = @IdProcessusRenouvellement 

-- Étapes 
DECLARE @InsertedIdsEt as table(ID bigint,IdProcessusEtape bigint) 
INSERT INTO T_ClientContratProcessusEtape 
     (IdClientContratProcessus,IdProcessusEtape,Nom,DateDebut,DelaiRappel,DateRappel,NomListeVeri fication,Sequence,IdStatutEtape,IdResponsable,IdTypeResponsable,ListeVerificationTermine) 
    OUTPUT Inserted.ID,Inserted.IdProcessusEtape INTO @InsertedIdsEt 
SELECT I.ID,E.ID, 
      E.Nom,GETDATE(),E.DelaiRappel,GETDATE(),COALESCE(L.Nom,''),E.Sequence,0,0,E.IdTypeResponsabl e,0 
FROM @InsertedIdsPro I INNER JOIN T_Ref_ProcessusEtape E ON I.IdProcessus =  E.IdProcessus 
LEFT JOIN T_Ref_ListeVerification L ON E.IdListeVerification = L.ID 

-- Étapes : Items de la liste de vérification 
INSERT INTO T_ClientContratProcessusEtapeListeVerificationItem 
    (IdClientContratProcessusEtape,Nom,Requis,Verifie) 
    SELECT I.ID,IT.Nom,IT.Requis,0 
    FROM @InsertedIdsEt I 
    INNER JOIN T_Ref_ProcessusEtape E ON I.IdProcessusEtape = E.ID 
    INNER JOIN T_Ref_ListeVerificationItem IT ON E.IdListeVerification =  IT.IdListeVerification 

-- Tâches 
DECLARE @InsertedIdsTa as table(ID bigint, IdProcessusEtapeTache bigint) 
INSERT INTO T_ClientContratProcessusEtapeTache 
     (IdClientContratProcessusEtape,IdProcessusEtapeTache,Nom,DateDebut,DelaiRappel,DateRappel,No mListeVerification,Sequence,IdStatutTache,IdResponsable,IdTypeResponsable,ListeVerificationT ermine) 
    OUTPUT Inserted.ID,Inserted.IdProcessusEtapeTache INTO @InsertedIdsTa 
    SELECT I.ID,T.ID, 
       T.Nom,GETDATE(),T.DelaiRappel,GETDATE(),COALESCE(L.Nom,''),T.Sequence,0,0,T.IdTypeResponsabl e,0 
    FROM @InsertedIdsEt I 
    INNER JOIN T_Ref_ProcessusEtapeTache T ON I.IdProcessusEtape = T.IdProcessusEtape 
    LEFT JOIN T_Ref_ListeVerification L ON T.IdListeVerification = L.ID 


-- Tâches : Items de la liste de vérification 
INSERT INTO T_ClientContratProcessusEtapeTacheListeVerificationItem 
    (IdClientContratProcessusEtapeTache,Nom,Requis,Verifie) 
    SELECT I.ID,IT.Nom,IT.Requis,0 
    FROM @InsertedIdsTa I 
    INNER JOIN T_Ref_ProcessusEtapeTache T ON I.IdProcessusEtapeTache = T.ID 
    INNER JOIN T_Ref_ListeVerificationItem IT ON T.IdListeVerification =  IT.IdListeVerification