2017-04-20 6 views
0

Ich möchte wissen, wie kann ich die vorletzte Identität in Sql Server das ist (n-1). Ich kann @identity-1 bekommen. Mein Problem ist, wenn vorherige gelöscht ist, wird die gesamte Berechnung falsch sein. Bitte helfen Sie dabei.Wie kann ich die vorletzte Identität in SQL Server abrufen?

+3

Was auch immer * Problem * Sie versuchen zu lösen, ist der Versuch, "vorletzte Identität" zu erhalten, nicht die Lösung. Können Sie das * breitere * Problem beschreiben, mit dem Sie umgehen möchten? –

+1

Ich denke für Ihren Anwendungsfall ist Kapils Antwort Übereinstimmung –

Antwort

1

Wenn Sie die maximale Identität der Tabelle erhalten möchten, dann sollten Sie

Select Max(IdentityColumn) from YourTable 

verwenden Wenn Sie die letzte Identität Ihrer Spalte, die Sie erhalten möchten, dann sollte verwenden

2

Ich denke, Sie versuchen, die zweite nächste maximale Wert Ihrer Identitätsspalte einer Tabelle zu finden. Abfrage für diesen:

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

Hier ist eine andere Möglichkeit, es zu tun, aber ich glaube, Damien ist richtig und du bist tter describ das eigentliche Problem, da die 2. letzte Wert einer Identitätsspalte bekommen ist wahrscheinlich nicht die Lösung:

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

Um nur den vorletzten Kennung, könnten Sie auch mit TOP LAG oder LEAD in Kombination verwendet werden.

Beachten Sie, dass dabei davon ausgegangen wird, dass es sich bei der ID um eine INT handelt, die von IDENTITY automatisch ausgefüllt wird.
Wenn die ID uniqueidentifier (alias Guid) ist, dann bedeutet das nicht, dass der Höchstwert den zuletzt erstellten Datensatz enthält.

Zum Beispiel:

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; 

Post Scriptum Test unter Verwendung einer Tabelle, die eine Identität hat:

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

Die aktuelle Identität der Tabelle kann durch SELECT IDENT_CURRENT('<YourTableName>')

Wie abgerufen werden So, Sie benötigen die unten, wenn Sie die zweite maximale Identität wollen:

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