【问题标题】:Using last identity inserted value to insert in another table使用最后一个标识插入值插入另一个表
【发布时间】:2021-05-31 14:28:51
【问题描述】:

我正面临这个奇怪的问题,花了几个小时。一点帮助将不胜感激。 这是一个 ASP.NET MVC 应用程序。为简单起见,我有两个 SQL 表,Employee(ID,Name,JoiningDate)和Benefits(ID,EmployeeID)。两个 ID 都是身份列。当新员工加入公司时,会在员工表和福利表中创建一个条目。

存储过程如下所示

 alter procedure usp_CreateEmployee
 @Name nvarchar(100),
 @JoiningDate datetime
 as
 declare @lastIdentity int
 insert into Employee(Name, JoiningDate) values(@Name, @JoiningDate)
 select @lastIdentity = ident_current('Employee')
 insert into Benefits(EmployeeID) values(@lastIdentity)

C# 方面我正在使用 Dapper

 var parameters = new DynamicParameters();
 parameters.Add("@Name", name);
 parameters.Add("@JoiningDate", joiningDate);
 affectedRows = connection.Execute("usp_CreateEmployee", parameters, null, commandType: CommandType.StoredProcedure);

当我在 SSMS 中执行存储过程时,一切正常。 (ident_current 返回最后插入的 id)。但是,当用户界面(通过 razor 页面)创建员工时,会在福利表中插入一个 NULL 作为 EmployeeID。员工表显示正确的员工 ID。

看起来不像是 SQL 问题。我的代码有什么问题吗?这可能与 Dapper 有关(尽管我不这么认为)?

【问题讨论】:

    标签: asp.net sql-server tsql identity-column


    【解决方案1】:

    我认为问题出在“ident_current”上。请参考这里:https://sqlperformance.com/2014/01/t-sql-queries/ident-current

    或者,您可以尝试下面的 sql 脚本。

    alter procedure usp_CreateEmployee
     @Name nvarchar(100),
     @JoiningDate datetime
     as
     declare @lastIdentity int
     insert into Employee(Name, JoiningDate) values(@Name, @JoiningDate)
     select top(1) @lastIdentity=ID from Employee where Name=@Name
     order by ID desc
      
     insert into Benefits(EmployeeID) values(@lastIdentity)
    

    【讨论】:

    • 非常感谢您分享文章和解决方案。你让我今天一整天都感觉很好。所以底线是 IDENT_CURRENT 不可信。
    猜你喜欢
    • 1970-01-01
    • 2012-06-23
    • 2016-02-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-11
    相关资源
    最近更新 更多