我在数据库中复制思维导图。结构为思维导图->节点->链接。 (“->”是一对多的。)
以下代码段正在复制节点。
DECLARE @mindmapNodes table(Id int, OldId int);
INSERT INTO [dbo].[MindmapNodes]
(
[MindmapId],
[Loc],
[Title],
[SnippetId]
)
OUTPUT INSERTED.Id
INTO @mindmapNodes
SELECT @mindmapId as [MindmapId]
,[Loc]
,[Title]
,[SnippetId]
FROM [dbo].[MindmapNodes] mindmapNodes
在输出子句中,我需要mindmapNodes。[Id]作为OldId。这将使我可以将[MindmapLinks]。[From]和[MindmapLinks]。[To]从原始节点更改为新的重复节点。
有没有办法做到这一点?
表格:
SELECT [Id]
,[Name]
,[DateCreated]
,[DateModified]
,[OwnerId]
FROM [dbo].[Mindmaps]
SELECT [Id]
,[MindmapId]
,[Loc]
,[Title]
,[SnippetId]
FROM [dbo].[MindmapNodes]
SELECT [Id]
,[From]
,[To]
,[FromPort]
,[ToPort]
,[MindmapId]
FROM [dbo].[MindmapLinks]
[MindmapLinks]。[来自]
[MindmapLinks]。[收件人]
是[MindmapNodes]的外键。[Id]
答案 0 :(得分:1)
汤姆:
您不能使用INSERT的SELECT部分中的列... SELECT in OUTPUT子句。 INSERT语句只能在中使用的列 OUTPUT子句是插入的伪表中的列。 幸运的是,有一种方法可以解决此限制。使用MERGE 通过使用始终为假的ON条件来模拟INSERT。
代码如下:
select *
into #temp
from [dbo].[MindmapNodes]
where [MindmapId] = 215
DECLARE @mindmapNodes table(Id int, OldId int);
MERGE INTO [dbo].[MindmapNodes]
USING #temp AS cf
ON 1= 0
WHEN NOT MATCHED THEN
INSERT
( [MindmapId],
[Loc],
[Title],
[SnippetId]
)
Values
(
216,
cf.Loc,
cf.Title,
cf.SnippetId
)
Output inserted.[Id], cf.[Id] INTO @mindmapNodes;