Return identity of last inserted row from stored procedure
我正在尝试从存储过程中返回最后插入的行的标识。
我的代码的简化版本如下:
1 2 3 4 5 6 7 8 9 10 11 12 13
| CREATE PROCEDURE [sp_name]
@AuthorisationCode uniqueidentifier
AS
INSERT INTO [tablename]
([AuthorisationCode]
)
VALUES
(@AuthorisationCode
)
RETURN @@IDENTITY
GO |
我正在通过Enterprise库4.1中的Execute Scalar调用此存储过程。
它返回null。有人看到我在做什么错。
- 顺便说一句,最好不要使用sp_前缀来命名proc。但是无论如何,也许那就是伪代码。
-
@Mark,谢谢,很高兴,但这只是psuedocode :)
-
通常将RETURNING值保留用于错误处理(例如,非0表示存在错误)。
-
@brad这可能意味着任何事情,说句公道话
-
@Mark,是的,它可以表示您想要的任何内容;那就是为什么我说它"通常是保留的"。
我想说您应该使用SCOPE_IDENTITY(),因为@@identity将返回最后插入的内容的标识(如果同时运行多个查询,则可能不是您的存储过程)。
您还需要选择它,而不要返回它。
ExecuteScalar将返回结果集第一行中的第一列值。
所以...
1
| SELECT SCOPE_IDENTITY(); |
可能是您想要的。
您应该使用select而不是return,但还应该使用SCOPE_IDENTITY来防止返回错误身份的问题,@@ IDENTITY不限于特定范围。
更多信息可以在这里找到:
http://msdn.microsoft.com/zh-cn/library/ms190315.aspx
-
1希望我可以投票不止一次;这是一个未得到充分利用的关键字
您应该使用select @@identity
- 我不想对您投反对票,但您应该真正使用SCOPE_IDENTITY而不是@@identity(请参阅MrEyes答案)
-
在这种情况下,@@ identity可能很好。了解当前身份,范围身份和@@ identity之间的区别很重要,但是@@ identity并不总是错误的。如果有一个出于某种不合理原因而在插入时更改标识的触发器,并且您想知道最后插入的标识怎么办?然后,您需要@@ identity和scope_identity无法正常工作。
-
是的,布拉德,这是真的,在这里使用scope_identity是更好的选择。 (嗯,不是更好的选择,但是,取决于您的需求,我猜)。 Althouhg,在我的回答中,我指的是"返回"的用法。在这里,降低投票权是正确的选择,这是两者之间的重要区别。
-
@帕特里克是对的:@@identity并不总是错误的。 @无用的,我不认为当您清楚地了解解决OP即时问题的方法时,降低投票是正确的选择:SELECTING使用ExecuteScalar时的结果