[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
あなたは 'SET IDENTITY_INSERT [テーブル名] on'のと' SET IDENTITY_INSERT [テーブル名] OFF'であなたの 'INSERT'文を囲むことにより、独自のアイデンティティ値を挿入することができます。また、この構造は、自己参照の外部キーを持つ単一のテーブルに単純化することができ、セルフ・ジョインを使用してデータを再帰的に選択することができます。 –
こんにちは、これはかなりシンプルに見えるかもしれませんが、これは例であるためです。実際のダイアグラムには6つのテーブルがあります。私は自分のアイデンティティを使うことができません。なぜなら、私は複数のコピーを作成できるからです。私はより多くの情報で自分の投稿を編集します。 –
同じ問題の興味深い解決策がありますが、SQL Server 2008以上でのみ動作します:http://stackoverflow.com/questions/5365629 – Chad