插入...选择输出子句,同时获取INSERTED.ID和SELECTED.ID

时间:2018-09-12 18:19:46

标签: sql-server

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

以下代码段正在复制节点。

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]

1 个答案:

答案 0 :(得分:1)

在这里找到答案:https://social.msdn.microsoft.com/Forums/sqlserver/en-US/8cf1e38e-a29b-4ad7-abc7-b9fe2b987698/insert-into-using-select-with-output-into-multipart-identifier-could-not-be-bound?forum=transactsql

汤姆:

  

您不能使用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;