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