多表插入异常:从表未关联主表ID,需实现主表ID关联插入
问题分析与解决办法
你遇到的问题核心在于获取主表自增ID的方式错误,导致从表tblAdmissionDetails插入时拿到的是未初始化的NULL值,自然关联不上主表的记录。
问题出在哪?
你原来的代码里,声明@Id变量后,用Select @Id as Id from AdmissionMaster试图获取ID——但这行代码根本没有给@Id赋值,只是把一个默认值为NULL的变量查询出来,等于没做任何有效操作。
正确的解决方案
SQL Server中,要获取当前会话当前作用域内刚插入的自增ID,最安全的方式是使用SCOPE_IDENTITY()函数,它会返回当前存储过程/批处理中最后插入的标识列值,不会被其他会话或触发器干扰。
修改后的完整存储过程
Create Procedure Sp_instAdminmaster ( @Name varchar(20), @FatherName varchar(20), @Email_Id varchar(20), @Address nvarchar(100), @City varchar(20), @State varchar(20), @Qualification varchar(30), @contactNo varchar(10), @Date date, @Remarks varchar(150), @Type varchar(20), @Fee money, @ClassName nvarchar(20), @Yearly money, @Halfyearly1 money, @Halfyearly2 money, @Quaterly1 money, @Quaterly2 money, @Quaterly3 money, @Quaterly4 money, @January money, @February money, @March money, @April money, @May money, @June money, @July money, @August money, @September money, @October money, @November money, @December money ) AS BEGIN -- 插入主表 Insert into AdmissionMaster( Name,FatherName,Email_Id,Address,City,State,Qualification,contactNo,Date,Remarks,Type,Fee,ClassName ) values ( @Name,@FatherName,@Email_Id,@Address,@City,@State,@Qualification,@contactNo, @Date,@Remarks,@Type,@Fee,@ClassName ); -- 正确获取刚插入的主表ID declare @Id int; SET @Id = SCOPE_IDENTITY(); -- 插入从表,使用获取到的主表ID insert into tblAdmissionDetails( Id,Yearly,Halfyearly1,Halfyearly2,Quaterly1,Quaterly2,Quaterly3,Quaterly4, January,February,March,April,May,June,July,August,September,October,November,December ) values( @Id,@Yearly,@Halfyearly1,@Halfyearly2,@Quaterly1,@Quaterly2,@Quaterly3,@Quaterly4, @January,@February,@March, @April,@May,@June,@July,@August,@September,@October,@November,@December ) END
为什么用SCOPE_IDENTITY()?
- 对比
@@IDENTITY:它会返回当前会话中所有作用域的最后标识值,如果主表AdmissionMaster有触发器插入其他带自增列的表,@@IDENTITY会返回触发器插入的ID,而非主表的ID。 - 对比
IDENT_CURRENT('AdmissionMaster'):它会返回指定表的最后标识值,不管是哪个会话插入的,可能拿到其他用户插入的ID,存在并发问题。
所以SCOPE_IDENTITY()是当前场景下最可靠的选择。
内容的提问来源于stack exchange,提问作者user12564297
相关产品推荐
相关产品推荐

