Sql server 如果在插入失败后选择SCOPE_IDENTITY(),会发生什么情况(SQL Server 2005)

Sql server 如果在插入失败后选择SCOPE_IDENTITY(),会发生什么情况(SQL Server 2005),sql-server,sql-server-2005,Sql Server,Sql Server 2005,MSDN文档对此并不完全清楚。也许我读得不够好 如果我执行一个insert(可能插入零行),后面是 ;SELECT SCOPE_IDENTITY() 然后通过ExecuteScalar()调用该命令 如果Insert没有插入任何行,结果会是什么 如果失败,我想停止,这样我就不会继续将子记录插入错误的父ID。如果没有插入标识,则SCOPE\u Identity()将返回null,您可以通过将SCOPE\u Identity()指定给变量,然后检查变量内容来检查指定的条件 插图 Create Pr

MSDN文档对此并不完全清楚。也许我读得不够好

如果我执行一个insert(可能插入零行),后面是

;SELECT SCOPE_IDENTITY()
然后通过ExecuteScalar()调用该命令

如果Insert没有插入任何行,结果会是什么


如果失败,我想停止,这样我就不会继续将子记录插入错误的父ID。

如果没有插入标识,则SCOPE\u Identity()将返回null,您可以通过将SCOPE\u Identity()指定给变量,然后检查变量内容来检查指定的条件

插图

Create Proc SomeInsertToFail(@ID int OUTPUT)
as
Begin
    Select @ID =  Scope_Identity()
End
Declare @SOMEID int
Exec SomeInsertToFail @SOMEID OUTPUT
Select @SOMEID  --This will yield null
空的


来源:对空白查询(也称为无插入)执行了SELECT scope_identity()

这取决于当前范围内是否有成功的插入

declare @tb table (i int identity, ky varchar(100));

insert into @tb values('Success');

insert into @tb select ky from @tb where ky = 'Failure';

select SCOPE_IDENTITY();  -- returns 1
select * from @tb

因此,我可以选择IsNull(Scope_Identity(),-1),以便始终获得有效的INT,并且失败值不能是实际的ID吗?(当然,假设我的身份从1开始)可能值得在一些更深奥的场景中进行测试。。。在触发器保持完整性并引发错误以阻止插入的表上插入…@Dems,这是一个有趣的测试,我将尝试一下。您的示例在技术上是正确的,但如果范围中存在其他插入,即使不是同一个表,请选择范围_identity()将返回上次成功插入的id。请不要忘记SQL Server中存在的范围\标识和@标识的并行执行错误: