SQL Server中MERGE操作Identity列报8102错误的解决方法咨询
问题根因
报错的核心原因是 IDENTITY_INSERT 配置仅支持在INSERT操作时手动指定自增标识列的值,不支持通过UPDATE修改标识列的值。你当前脚本中WHEN MATCHED分支的更新逻辑本身是冗余的:MERGE的匹配条件就是t.[Id] = s.[Id],尝试将t.Id设置为s.Id不会修改任何数据,完全没有必要保留。
修复后脚本
直接删除冗余的匹配更新分支即可,修改后的完整脚本如下:
PRINT 'Update rows in [Survey].[Portfolio]' GO SET IDENTITY_INSERT [Survey].[Portfolio] ON MERGE [Survey].[Portfolio] AS t USING ( VALUES (1), (2) ) AS s([Id]) ON (t.[Id] = s.[Id]) WHEN NOT MATCHED BY TARGET THEN INSERT ([Id]) VALUES (s.[Id]) -- 删除原有的冗余更新逻辑 WHEN NOT MATCHED BY SOURCE THEN DELETE; GO PRINT '' PRINT 'Operation applied [Survey].[Portfolio]' PRINT '' GO -- 建议用完及时关闭标识插入开关,避免后续操作异常 SET IDENTITY_INSERT [Survey].[Portfolio] OFF GO
补充说明
如果确实有需要修改已存在行的自增Id值的场景,无法通过UPDATE直接实现,只能先删除对应旧行,再插入带有目标Id值的新行。
内容的提问来源于stack exchange,提问作者Eugene Sukh
相关产品推荐
相关产品推荐

