当前位置: 首页 > news >正文

SQL Server中关于 INSERTED.Id 与 SCOPE_IDENTITY() 获取新增数据的Id

前景:

通过程序将一个数据库的主表+子表的数据迁移至新的数据库,表的id未自增长,源数据存在删除的情况,所以需要获取插入数据新增id和旧id的比对关系数据

通过如下语句来获取新旧id

BEGIN TRY  BEGIN TRANSACTION;DECLARE @Map TABLE (OldId int, Id int);--临时表存储新旧idINSERT INTO SupportGroup (CompanyId,GroupCode,GroupName,Description,Status,Type,CreationDate,CreatedBy,UpdatedDate,UpdatedBy)OUTPUT INSERTED.Id,86 INTO @Map(Id,OldId)VALUES (N'86',N'T-86',N'全部权限',N'',1,1,'2023/9/21 10:09:32',N'TEST01','2025/9/16 10:45:00',N'TEST01');INSERT INTO SupportGroup (CompanyId,GroupCode,GroupName,Description,Status,Type,CreationDate,CreatedBy,UpdatedDate,UpdatedBy)OUTPUT SCOPE_IDENTITY(),87 INTO @Map(Id,OldId)VALUES (N'87',N'T-87',N'VND全部',N'',1,1,'2023/9/21 14:04:44',N'TEST01','2023/9/21 14:04:44',N'TEST01');INSERT INTO SupportGroup (CompanyId,GroupCode,GroupName,Description,Status,Type,CreationDate,CreatedBy,UpdatedDate,UpdatedBy)OUTPUT SCOPE_IDENTITY(),108 INTO @Map(Id,OldId)VALUES (N'108',N'T-108',N'wl_test',N'测试222',1,1,'2025/8/21 11:55:57',N'TEST01','2025/8/27 15:56:30',N'TEST01');COMMIT TRANSACTION;  -- 一切正常就提交
END TRY
BEGIN CATCHIF XACT_STATE() <> 0ROLLBACK TRANSACTION;  -- 出错就回滚-- 把错误抛出来(可选)DECLARE @errMsg nvarchar(4000) = ERROR_MESSAGE();RAISERROR (@errMsg, 16, 1);END CATCH;
SELECT OldId, Id FROM @Map;--获取新旧id

 

异常:

这个语句在数据库中执行没有任何问题,也能正常返回新旧id列表,但是在程序中执行这个语句就会出现一个问题

1.返回的一条新旧id数据中,新id是空的,且只有前面30 条<总共批量插入119条>被DBRearder读出来了,后面的89条出现异常(“数据提示不可用,不是有效的格式说明符”)

 

原因:

1.首先OUTPUT 子句里 SCOPE_IDENTITY() 语法上就被禁止

2.即使将来允许,它返回的也是“当前作用域里最后一条 INSERT 产生的 ID”,而 OUTPUT 子句是逐行触发的,语义上就会互相覆盖

3.OUTPUT 只认 INSERTED.Id

 

初衷:

鉴于之前的了解SCOPE_IDENTITY()获取的是作用域内新增数据的id,而 INSERTED.Id获取的是这张表最新新增数据的id,可能获取到的是其他途径新增的id

所以此处就使用SCOPE_IDENTITY()来获取新增数据的Id

 

特别的:

后了解到在OUTPUT 中使用INSERTED.Id 直接拿到“本条正在插入的行”的身份值,与并发、与顺序、与作用域都无关。

 

解决:

将SCOPE_IDENTITY()改为使用INSERTED.Id 获取本条新增数据的Id

 

http://www.gsyq.cn/news/23007.html

相关文章:

  • 2025年视频拍摄服务权威推荐榜:创意剪辑与高清画质完美结合,打造视觉盛宴!
  • pytorch p66实训二
  • 2025年网络推广服务商权威推荐榜单,SEO优化,SEM营销,社交媒体推广,内容营销公司推荐
  • 日志分析-Tomcat日志分析
  • 2025年手持式光谱仪厂家权威推荐榜单:精准检测与便携操作的行业首选!
  • Notepad++中替换时保留分组字符
  • 2025年铝单板厂家推荐排行榜,氟碳/木纹/冲孔/外墙/雕花/异形/双曲/弧形/雕刻铝单板公司精选!
  • 2025年机电安装厂家权威推荐榜单:覆盖管道/电气/生物医药工厂/暖通空调/空压系统/纯水系统/厂房通风/车间配电/机械设备安装,专业服务之选!
  • 03-转义字符
  • 2025 年最新推荐集装箱拖车供应厂家权威榜单:全方位解析优质企业实力,助力高效物流运输选择
  • Nginx常用配置
  • 单载波系统QPSK的频偏估计算法
  • 2025 最新瓷砖厂家排行榜出炉:精选优质品牌权威推荐,助力家居与工程选购决策
  • 2025年连铸机设备厂家推荐排行榜,扇形段,大包回转台,钢包中间罐,结晶器总成,振动装置,尾坯夹送装置,移动平台,拉矫机,引锭杆,输送辊道,横向移钢机,钢坯液压剪公司精选!
  • 2025 人力资源管理系统公司最新推荐榜单:聚焦前沿技术与服务实力,解锁企业人效革新路径
  • n8n零基础入门:5分钟搭建你的第一个自动化工作流
  • Hudi系列:表类型(Table Query Types)
  • 2025 仿木纹铝单板采购,四川汇才口碑好
  • 2025 选双曲铝单板,就找四川汇才铝业
  • Vue3 父子组件之间的双向数据绑定
  • 2025年西安买房新楼盘口碑排行榜TOP10:地建嘉信臻城领跑高端住宅市场
  • 2025年10月石墨电极厂家推荐榜单:河北晶碳科技深度评测与行业对比
  • CRMEB批量发货源码解析:自定义扩展与性能优化实践
  • Java并发之AQS详解
  • 2025 年光谱仪厂家最新推荐排行榜:便携式 / 有色金属 / X 射线荧光等多类型设备优质厂家深度解析
  • Kafka、RabbitMQ、RocketMQ、ZeroMQ等 消息中间件 介绍和对比
  • 从零开始:C# 解析docx提取文本-无需安装office软件且完美支持aot
  • 猪脚与猪脚饭与猪脚饭之店
  • 2025年10月中国高端医美机构推荐榜单:安全认证与专家资质全解析
  • ONLYOFFICE Docs 9.1正式发布:更强大的PDF编辑器、更快的公式性能、超500项优化!