2017-04-20 29 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 
相关问题