Tsql 在SQLServer2005的树状结构中插入多行
我有几个SQL中的表,它们非常类似Tsql 在SQLServer2005的树状结构中插入多行,tsql,sql-server-2005,Tsql,Sql Server 2005,我有几个SQL中的表,它们非常类似 A B C ID_A ID_B ID_C Name Name Name ID_A ID_B Client -- (0-N) Sequence -- (1-N) ClientProcesses -- (1-N) ClientSteps -- (1-N)ClientTasks -- (0-N) ClientTaskChec
A B C
ID_A ID_B ID_C
Name Name Name
ID_A ID_B
Client -- (0-N) Sequence -- (1-N) ClientProcesses -- (1-N) ClientSteps -- (1-N)ClientTasks -- (0-N) ClientTaskCheckList
-- (0-N)ClientStepCheckLists
如您所见,A链接到B,B链接到C。这些基本上是包含数据模型的表。现在,我需要能够基于这些表创建日期。例如,如果我有以下数据
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中使用内置函数完全实现这一点。这可能吗?谁能给我举个简单的例子。我设法做到了一个水平,但我感到困惑的休息
谢谢
编辑:上面的信息只是一个例子,因为我的实际图表看起来更像这样
A B C
ID_A ID_B ID_C
Name Name Name
ID_A ID_B
Client -- (0-N) Sequence -- (1-N) ClientProcesses -- (1-N) ClientSteps -- (1-N)ClientTasks -- (0-N) ClientTaskCheckList
-- (0-N)ClientStepCheckLists
模型表:
Processes -- (1-N) Steps -- (1-N) Task -- (0-N) TaskCheckList
-- (0-N) StepsCheckLists
我需要填写的表格是这样的
A B C
ID_A ID_B ID_C
Name Name Name
ID_A ID_B
Client -- (0-N) Sequence -- (1-N) ClientProcesses -- (1-N) ClientSteps -- (1-N)ClientTasks -- (0-N) ClientTaskCheckList
-- (0-N)ClientStepCheckLists
客户端已经存在,当我需要运行脚本时,我会创建一个序列,该序列将包含所有进程,其中将包含其步骤、tak等
所以我做了很多尝试和错误,下面是我得到的。它似乎工作得很好,尽管对于一开始看起来很简单的事情来说,它听起来相当大
因为我们的客户是法国人,我们也是法国人。它会在我需要的所有表中插入每个日期。唯一剩下的就是第一行,我需要根据一些参数选择要插入的日期,但这是最简单的部分
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
您可以通过在insert语句周围使用SET identity_insert[TableName]ON和SET identity_insert[TableName]OFF来插入自己的标识值。此外,此结构可以简化为具有自引用外键的单个表,并且可以使用自连接递归选择数据。嗨,这看起来很简单,但这是因为这是一个示例。实际图表有6个表。另外,我不能使用自己的身份,因为我希望能够创建多个副本。我将用更多信息编辑我的帖子。对于相同的问题,这里有一个有趣的解决方案,但它仅适用于SQL Server 2008或更高版本: