2017-04-20 25 views
0

我想知道如何檢索最後只有一個標識在Sql Server 即(n-1)。我可以得到@identity-1。我的問題是,當前一個是刪除整個計算將是錯誤的。請幫助。如何檢索SQL Server中的最後一個標識?

+3

無論你試圖解決什麼*問題,試圖獲得「最後一個身份」並不是解決方案。你能概述你想要處理的更廣泛的問題嗎? –

+1

我認爲你的用例Kapil的答案是匹配 –

回答

1

如果你想獲得表的最大身份那麼你應該使用

Select Max(IdentityColumn) from YourTable 

如果你希望得到您的列的最後一個標識那麼你應該使用

SELECT TOP(1) IdentityColumn FROM YourTable ORDER BY IdentityColumn DESC 
2

我想你正試圖找到第二個下一個最大值你的表的標識列。查詢爲:

Select max(identityColumnName) from [tablename] where identityColumnName  
not in (select max(identityColumnName) from [tablename]) 
1

這是另一種方法,但我相信達米安是正確的,你是tter describ實際的問題,因爲越來越標識列的第二個最後的值可能不是解決辦法:

SELECT TOP 1 IdentityColumn 
FROM 
(
    SELECT TOP 2 IdentityColumn 
    FROM YourTable 
    ORDER BY IdentityColumn DESC 
) t 
ORDER BY IdentityColumn 
1

只得到倒數第二個標識,您也可以使用LAG或鉛結合TOP。

請注意,這是假定ID是由IDENTITY自動填充的INT。
當ID是uniqueidentifier(又名Guid)時,對它進行排序並不意味着最大值給出了最後創建的記錄。

例如:使用具有的身份的表

declare @T table (id int identity(1,1), value varchar(30)); 

insert into @T (value) values 
('A'),('B'),('C'),('D'),('E'); 

select top 1 
lag(id) over (order by id) as BeforeTheLastId 
from @T 
order by id desc; 

select top 1 
lead(id) over (order by id desc) as BeforeTheLastId 
from @T 
order by id desc; 

-- But to get the last Id, a max will do 
select max(id) as LastId from @T; 

郵政scriptum測試:

IF OBJECT_ID('tempdb..#tmpTest') IS NOT NULL DROP TABLE #tmpTest; 
create table #tmpTest (id int identity(1,1) primary key, value varchar(30), createdOn datetime2 default SYSDATETIME()); 
insert into #tmpTest (value) values ('A'),('B'),('C'),('D'); 

declare @MaxIdBeforeInsert int; 
select @MaxIdBeforeInsert = max(id) from #tmpTest; 
insert into #tmpTest (value) values('E'); 

select * from #tmpTest; 

select 
IDENT_CURRENT('tempdb..#tmpTest') as CurrentIdentity, 
@@IDENTITY as IdentityVar, 
SCOPE_IDENTITY() as ScopeIdentity, 
@MaxIdBeforeInsert as MaxIdBeforeInsert; 
0

表中的當前標識可以通過SELECT IDENT_CURRENT('<YourTableName>')

作爲檢索例如,如果您想要第二個最大標識,則需要以下代碼:

SELECT ISNULL(IDENT_CURRENT('<YourTableName>'), 1)-1 
相關問題