为什么@@ Identity返回null?

时间:2010-10-06 19:30:40

标签: sql sql-server sql-server-2000

我有一个.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));

5 个答案:

答案 0 :(得分:6)

  • 您应该始终使用SCOPE_IDENTITY()
  • 无法通过存储过程中的RETURN返回NULL。你会得到一个SQL警告,它会返回零。
  • ExecuteScalar查找记录集的第1行第1列。
  • 上面没有记录集

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

答案 1 :(得分:2)

ExecuteScalar

  

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

因此您需要将RETURN语句重写为

SELECT -1

SELECT CAST(SCOPE_IDENTITY() AS INT)
分别

答案 2 :(得分:1)

你必须在插入后立即调用@@ IDENTITY,而是使用Scope_identity()。

答案 3 :(得分:1)

因为你的问题遗漏了很多细节,我只想提一些可能的方法,因为在没有所有细节的情况下似乎无法回答问题。但这是你第一次来这里,所以你会变得更好。你会的吗?

无论如何,首先我会说你应该总是使用scope_identity,因为它更安全。幕后可能会出现可能导致这些真正问题的触发器。坚持使用scope_identity,您不必担心。

其次我会建议而不是

RETURN

使用

SELECT SCOPE_IDENTITY()

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

只是我的想法。

答案 4 :(得分: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()