如何在SQL Server中检索最后一个身份?

时间:2017-04-20 06:23:49

标签: sql sql-server

我想知道如何在Sql Server中检索最后一个标识 那是(n-1)。我可以@identity-1。我的问题是,当前一个删除时,整个计算将是错误的。请帮忙。

5 个答案:

答案 0 :(得分:2)

我猜您正在尝试找到表格标识列的第二个下一个最大值。查询:

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

答案 1 :(得分:1)

如果您想获得表格的最大身份,那么您应该使用

 Select Max(IdentityColumn) from YourTable

如果您想获得列的最后一次身份,那么您应该使用

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

答案 2 :(得分:1)

这是另一种方法,但我相信Damien是正确的,你更好地描述了实际问题,因为获得标识列的第二个最后一个值可能不是解决方案:

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

答案 3 :(得分:1)

要获得倒数第二个标识符,您还可以将LAG或LEAD与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;

使用具有标识的表进行脚本测试:

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;

答案 4 :(得分:0)

可以通过SELECT IDENT_CURRENT('<YourTableName>')

检索表格的当前标识

因此,如果您想要第二个最大身份,则需要以下内容:

SELECT ISNULL(IDENT_CURRENT('<YourTableName>'), 1)-1