Sql server 插入select output子句,获取INSERTED.ID和SELECTED.ID

Sql server 插入select output子句,获取INSERTED.ID和SELECTED.ID,sql-server,Sql Server,我正在复制数据库中的思维导图。结构是思维导图->节点->链接。->是一对多 下面的代码片段正在复制节点 DECLARE @mindmapNodes table(Id int, OldId int); INSERT INTO [dbo].[MindmapNodes] ( [MindmapId], [Loc], [Title], [SnippetId] ) OUTPUT INSERTED.Id INTO @mindmapNodes SELECT @mindmapId

我正在复制数据库中的思维导图。结构是思维导图->节点->链接。->是一对多

下面的代码片段正在复制节点

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]作为output子句中的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]。[From]

[思维导图链接][至]

是[MindmapNodes]的外键。[Id]

在此处找到答案:

汤姆:

无法使用插入的“选择”部分中的列。。。选入 输出子句。INSERT语句只能在中使用的列 OUTPUT子句是插入的伪表中的列。 幸运的是,有办法绕过这一限制。使用“合并”来 通过使用始终为false的ON条件来模拟插入

代码如下:

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;
在这里找到了答案:

汤姆:

无法使用插入的“选择”部分中的列。。。选入 输出子句。INSERT语句只能在中使用的列 OUTPUT子句是插入的伪表中的列。 幸运的是,有办法绕过这一限制。使用“合并”来 通过使用始终为false的ON条件来模拟插入

代码如下:

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;

只需输出inserted.Id,deleted.Id?@MK_u;OUTPUT inserted.Id,deleted.Id作为OldId-已删除的多部分标识符。Id无法绑定。OldId是什么意思?这里没有旧ID,它是insert语句。您发布的代码将失败,因为insert语句中的列比表中的列多。哦,抱歉,请不要再提我的最后一条评论。我犯了一个错误。这几乎可以归结为@SeanLange刚刚写的东西。@SeanLange它有效,如果我删除OldId,它就在那里,这样你们就能理解我的要求。旧Id是我复制的原始Id。基本上,我需要从MindmapNodes中选择[Id]作为旧Id暗示输出插入。Id,删除。Id?@MK_u;OUTPUT inserted.Id,deleted.Id作为旧Id-删除的多部分标识符。Id无法绑定。您所说的旧Id是什么意思?这里没有旧ID,它是insert语句。您发布的代码将失败,因为insert语句中的列比表中的列多。哦,抱歉,请不要再提我的最后一条评论。我犯了一个错误。这几乎可以归结为@SeanLange刚刚写的东西。@SeanLange它有效,如果我删除OldId,它就在那里,这样你们就能理解我的要求。旧Id是我复制的原始Id。基本上,我需要从MindmapNodes中选择[Id]作为旧Id