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