SQL Server存储过程调用IDENT_CURRENT等获取插入ID返回NULL问题
问题根因
你表中的idFactura主键列未使用SQL Server原生的IDENTITY自增属性,是通过自定义序列Idfac的NEXT VALUE FOR语法生成默认值。而@@IDENTITY、SCOPE_IDENTITY()、IDENT_CURRENT三个函数仅支持获取IDENTITY自增列生成的最新值,无法识别序列生成的主键,返回NULL属于正常的预期结果。
最优解决方案
推荐使用INSERT语句的OUTPUT子句直接返回刚插入记录的主键值,该方式不受并发操作影响,准确性最高,修改后的存储过程代码如下:
CREATE OR ALTER PROCEDURE USP_RegistrarFactura @Nombre_sucursal varchar(20), @Nombre_cliente varchar(100), @Numero_factura varchar(10), @Fecha Datetime, @Subtotal DECIMAL(18, 2) AS BEGIN INSERT INTO Factura (Nombre_sucursal, Nombre_cliente, Numero_factura, Fecha, Subtotal, total) OUTPUT inserted.idFactura AS Result VALUES (@Nombre_sucursal, @Nombre_cliente, @Numero_factura, @Fecha, @Subtotal, @Subtotal * 1.18) END
可选解决方案
如果需要提前拿到主键值做后续业务逻辑处理,可以先调用序列获取值,再手动插入到表中:
CREATE OR ALTER PROCEDURE USP_RegistrarFactura @Nombre_sucursal varchar(20), @Nombre_cliente varchar(100), @Numero_factura varchar(10), @Fecha Datetime, @Subtotal DECIMAL(18, 2) AS BEGIN DECLARE @NewId INT = NEXT VALUE FOR Idfac; INSERT INTO Factura (idFactura, Nombre_sucursal, Nombre_cliente, Numero_factura, Fecha, Subtotal, total) VALUES (@NewId, @Nombre_sucursal, @Nombre_cliente, @Numero_factura, @Fecha, @Subtotal, @Subtotal * 1.18) SELECT @NewId AS Result; END
内容的提问来源于stack exchange,提问作者douglas
相关产品推荐
相关产品推荐

