我正在复制数据库中的思维导图。结构是mindmap->nodes->links。 (“->”是一对多)。
下面的代码片段正在复制节点。
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] 的外键
最佳答案
汤姆:
You can't use columns from the SELECT part of an INSERT ... SELECT in the OUTPUT clause. The only columns an INSERT statement can use in the OUTPUT clause is columns in the inserted pseudo table. Fortunately, there is a way around this restriction. Use MERGE to simulate an INSERT by using an ON condition that is always false.
代码如下:
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;
关于sql-server - Insert ... select 输出子句,得到 INSERTED.ID 和 SELECTED.ID,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52301291/