为什么@@Identity返回null?

3

我有一个使用.NET 2010的应用程序,连接到SQL2000数据库。代码非常基础。当我插入一条记录时,记录会被插入,但是id没有返回。id列是int类型,并且是自增的。以下是存储过程...

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));

1
@spinon:我相信在问题的标题中,OP说返回了“NULL”。 - Joe Stefanelli
@Joe 你说得对。我以为在某个地方看到过,但在问题中没有看到。我忘记看标题了。谢谢你指出来! - spinon
5个回答

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

因此,您应该使用SELECT SCOPE_IDENTITY()而不是RETURN SELECT SCOPE_IDENTITY()


3

ExecuteScalar

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

因此,您需要将返回语句重写为

SELECT -1

由于 scope_indentity() 返回的是 numeric(38,0) 类型,因此...

SELECT CAST(SCOPE_IDENTITY() AS INT)

分别

1

因为你的问题缺少很多细节,所以我只会提到一些可能的解决方法,因为没有所有细节是不可能回答问题的。但这是你第一次来这里,所以你会变得更好的。对吧?

无论如何,首先我会说你应该始终使用scope_identity,因为它更安全。触发器背后可能会发生一些事情,这可能会导致真正的问题。坚持使用scope_identity,你就不必担心了。

其次,我建议改用

RETURN

使用

SELECT SCOPE_IDENTITY()

最后,我想说为什么不使用输出参数而不是返回结果。我没有任何支持下一个语句的东西,但我认为这样做更好。再次没有证据,但似乎使用输出参数比带有模式的结果集更少开销。
这只是我的想法。

1

在插入操作之后,您必须立即调用@@IDENTITY,而应使用Scope_identity()。


在这种情况下没有帮助。获取最后插入的ID是正确的,但仍然不会将数据返回给客户端。 - gbn

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()

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接