sql-server - Insert ... select 输出子句,得到 INSERTED.ID 和 SELECTED.ID

标签 sql-server

我正在复制数据库中的思维导图。结构是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] 的外键

最佳答案

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

汤姆:

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/

相关文章:

c# - SQL Server 中大型 IN 子句的替代方法

sql - 如何检查SQL Server 2008中用户定义表类型是否存在?

sql-server - 编写适当的表描述

sql-server - 基于选择到同一个表的更新 - AGAIN 和 AGAIN

sql - 仅当记录具有特定标签时才获取记录

c# - 使用 select 语句后将值存储在变量中

sql-server - SQL Server 中 ORDER BY 时性能低下

SQL Server 正则表达式

sql-server - 如何插入默认值作为 SQL Server View 定义的一部分?

sql - 执行从数据库表返回的存储过程