@@ Identity为什么返回空值?

问题描述 投票:3回答:5

我有一个.NET 2010应用程序,命中SQL2000数据库。该代码非常基本。当我插入记录时,将插入记录,但不会返回ID。 id列是一个int,它是一个Idetity。这是存储的过程...

ALTER PROCEDURE Insert_Vendor

@CorpID as varchar(255), 
@TaxpayerID as varchar(255)
AS

Insert into  dbo.Vendor
(
vdr_CorpID, 
vdr_TaxpayerID
)
values
(
@CorpID, 
@TaxpayerID
)

        IF @@error <> 0 
            BEGIN
                RETURN -1
            END
        ELSE 
        RETURN @@Identity
GO

在接收端...

 int myID = (int)(db.ExecuteScalar(dbCommand));
sql sql-server sql-server-2000
5个回答
6
投票
  • 您应始终使用SCOPE_IDENTITY()
  • NULL无法从存储的过程中通过RETURN返回。您会收到一条SQL警告,它将返回零。
  • ExecuteScalar查找记录集的第一行,第一列。上面没有记录集

...所以您将使用SELECT SCOPE_IDENTITY()而不是RETURN SELECT SCOPE_IDENTITY()


3
投票

ExecuteScalar

执行查询,并返回第一行的第一列查询返回的结果集

所以您需要将RETURN语句重写为:

SELECT -1

并且(因为scope_indentity()返回numeric(38,0)

SELECT CAST(SCOPE_IDENTITY() AS INT)

分别


1
投票

您必须在插入后立即调用@@ IDENTITY,请改用Scope_identity()。


1
投票

由于您的问题遗漏了许多细节,我将仅提及几种可能的解决方法,因为没有所有细节似乎无法回答问题。但这是您第一次来这里,您会变得更好。你会说对吗?

无论如何,首先我要说的是,您应该始终使用scope_identity,因为它更安全。幕后可能会发生某些事情,而触发器可能会导致此实际问题。坚持使用scope_identity,您不必担心。

第二个我建议代替

RETURN

使用

SELECT SCOPE_IDENTITY()

最后,我要说为什么不只使用OUTPUT参数而不是返回结果。我没有任何东西可以支持下一条声明,但我认为这会更好。再次没有任何证据,但是输出参数与模式附带的结果集的开销似乎较小。

只是我的想法。


0
投票

我个人建议使用SCOPE_IDENTITY而不是@@ IDENTITY。话虽这么说,问题出在存储过程中。上面的Devio是正确的,执行标量正在寻找第一行的第一列。 RETURN语句不会执行此操作,因此您将需要使用以下任一项:

    IF @@error <> 0 
    BEGIN
        Select -1
    END
    ELSE 
    Select @@Identity

或:

    IF @@error <> 0 
    BEGIN
        Select -1
    END
    ELSE 
    Select SCOPE_IDENTITY()
© www.soinside.com 2019 - 2024. All rights reserved.