How to get missing values from an Identity column?
Let us assume that there is an Employee table with EmployeeId as the Identity column in which some values are missing. The following batch will show all the missing values in that Identity column. The logic I preferred is to create another table with the same increment as that of the parent table but without any gaps. Finally, subtracting the parent table rows from the newly created table gives us the missed values. Rest of the script is pretty straight forward and self explanatory.
Declare
@MinEmpId int
Declare
@MaxEmpId int
Declare
@sql nvarchar(250)
select
@MinEmpId = Min(EmployeeID),@MaxEmpId = Max(EmployeeID) from Employee
SET
@sql = 'Create Table Temp1(Id int IDENTITY(' + cast(@MinEmpId as varchar(25))+ ',1),DummyCol int)'
EXEC
sp_executesql @sql
while
(@MinEmpId <= @MaxEmpId)
begin
Insert into Temp1(DummyCol) Values(1)
set @MinEmpId = @MinEmpId + 1
end
Select
Id from Temp1
Except
Select
EmployeeId from Employee
Drop
Table Temp1
The above script can be made reusable by making it a stored procedure using Dynamic Sql as shown below. It just accepts table name as a parameter and does the rest of the job.
CREATE
PROC GetMissingIds(@TableName Varchar(50))
AS
BEGIN
Declare
@MinEmpId int
Declare
@MaxEmpId int
Declare
@Increment int
Declare
@sql nvarchar(250)
SET
@sql = 'SELECT @Increment=IDENT_INCR(''' + @TableName + ''')'
EXEC
sp_executesql @sql, N'@Increment Int OUTPUT', @Increment OUTPUT
SET
@sql = 'select @MinEmpId=Min($Identity),@MaxEmpId=Max($Identity) from ' + @TableName
EXEC
sp_executesql @sql, N'@MinEmpId Int OUTPUT,@MaxEmpId Int OUTPUT',@MinEmpId OUTPUT,@MaxEmpId OUTPUT
SET
@sql = 'Create Table Temp1(Id int IDENTITY(' + cast(@MinEmpId as varchar(25))+ ',' + cast(@Increment as Varchar(10)) + '),DummyCol int)'
EXEC
sp_executesql @sql
while
(@MinEmpId <= @MaxEmpId)
begin
Insert into Temp1(DummyCol) Values(1)
set @MinEmpId = @MinEmpId + @Increment
end
SET
@sql = 'Select Id from Temp1 EXCEPT Select $Identity From ' + @TableName
EXEC
sp_executesql @sql
Drop
Table Temp1
END
Hope this helps.
Comments
- Anonymous
September 17, 2008
PingBack from http://hoursfunnywallpaper.cn/?p=6564