2009-11-13 40 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

相關問題