2009-11-13 68 views
3

我想使用max(Id)函数获取最后一个Id,其中Id是主键。我的代码运行良好,除非我从表中删除最后一行,因为当我删除最后一行时,该Id仍然保留,在这种情况下,max(Id)将检索最后一行Id,但不会从表中删除该Id。如何获取从SQL表中删除的最后一行的ID

是否有任何检索最后一行删除标识的函数。我已经看到一些使用scope_identity()@@identity函数获得当前ID的帖子。我已经使用这些功能,但他们不工作。我正在编辑我的代码在一个dll文件里,可能是dat正在创建问题。

+0

你似乎是做了很多与.dat文件的工作。 – 2009-11-13 19:18:07

+1

你真的*试图做什么?您向我们介绍了您的解决方案,并与其一起走向了一个障碍,我怀疑您正在努力推动该解决方案。让我们回到需要的一步,我们可以完全提出一种替代方法。你是否想要获得最高的ID?当然,我不能做出任何承诺;)。 – 2009-11-13 19:24:42

+2

您可能想重新考虑如何删除这些行。最佳做法是尽可能通过主键删除,因此在删除之前您应该确实拥有该ID。 – 2009-11-13 19:26:18

回答

2

您可以创建一个TRIGGER FOR DELETE事件,并在日志表中插入已删除的记录。

CREATE TABLE LogDeletetable 
(
    ID   int   IDENTITY(1,1) PRIMARY KEY CLUSTERED, 
    [datedelete] smalldatetime NOT NULL DEFAULT Getdate(), 
    ExtID int 
) 

CREATE TRIGGER TriggerONDELETE 
ON MyTable 
FOR DELETE 
AS 
DECLARE @ID int  
SET @ID = (SELECT ID FROM deleted)  
INSERT Logtable (ExtID) VALUES(@ID) 
GO 

然后,您可以针对已删除记录的表myLogtable进行查询。

Select * FROM Logtable 
+0

如果你的数据库支持触发器,它可能支持存储过程 - 所以你可以使用存储过程来执行删除操作,然后返回它删除的ID。 (或者像Sonny Boy所说的那样,首先将ID用于删除) – Joe 2009-11-13 19:52:14

1

@@身份和SCOPE_IDENTITY()只对当前会话返回最新标识值。

要获得已曾经被分配给表(即使他们中的一些已经被删除),你可以使用IDENT_CURRENT

BOL把它描述为如下的最高标识值: IDENT_CURRENT返回的最后一个标识在任何会议的特定表和任何范围产生价值

http://msdn.microsoft.com/en-us/library/ms175098.aspx

相关问题