Technical Article

Swiss Cheese!

,

Hello all,

Have you ever wondered what happened to the numbers' sequence having gaps?

If you have a table with a numeric columns (non-identity) that may have been used for ID, or product number, etc, then there are times that you as a developer would like to know if there are any gaps in the sequence and if those might have been caused and generated by a bug or a faulty application code.

Here is a simple way of determining that.

The script in here will accept ANY fully qualified table name, the 4 part naming of remote server and 3 part naming if local server  that you know, and the column name and viola.

http://msdn.microsoft.com/en-us/library/ms187879.aspx

You will get a list of the gaps.  Either single numbers, or range of numbers.

Hope this can be helpful.

enjoy

JohnE

/****** Object:  StoredProcedure [dbo].[USP_DisplaySequenceGap_Range]    Script Date: 04/02/2012 14:23:53 ******/SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author:<Author,,John Esraelo>
-- Create date: <Create Date,,201111032110>
-- Description:<Description,,USAGE: PASS FQN FOR A DB AND A FIELDNAME, ADD A RANGE OF FIELD VALUE AND RETURN GAPS>
-- USP_DisplaySequenceGap_Range 'main.dbo.PO','PO', 1000000, 9000000
-- =============================================
ALTER PROCEDURE [dbo].[USP_DisplaySequenceGap_Range]
  @Table as nvarchar(128) = 'MyDB.dbo.Employees'
 ,@Field as nvarchar(128) = 'ID'
 ,@From  as bigint = 5000
 ,@To    as bigint = 10000
AS
BEGIN
set nocount on 

declare @head bigint, @tail bigint, @pivot bigint
declare @RecKey bigint, @RecSeq bigint

create table #MyList
(
 RecKey bigint primary key identity(1,1) not null 
,RecSeq bigint null
)

truncate table #MyList 

declare @statement nvarchar(512)
set @statement = 
N'
;with NewSet as
(
select [' + convert(nvarchar(128), @Field)  + ']
from ' + @Table + ' 
where isnumeric([' + convert(nvarchar(128), @Field) + '])=1

)
insert into #MyList (RecSeq)
select convert(numeric, [' + convert(nvarchar(128), @Field) + ']) TheField 
from NewSet
order by [' + convert(nvarchar(128), @Field) + ']'
--print @statement
exec(@statement)

delete #MyList 
where RecSeq < @from or  RecSeq > @to 

declare MyCursor cursor for 
select RecKey, RecSeq from #MyList

open MyCursor

Fetch next from MyCursor
into @RecKey, @RecSeq

set @head = @RecSeq
set @tail = @head
set @pivot = @RecKey

declare @outfile table 
( Header nvarchar(128), Msg nvarchar(128))

while @@fetch_status = 0
begin
if @tail >  @head + 1 
  insert into @outfile (header, msg)
select 'Missing/Gap in Sequence:: ' ,  
case @tail-@head 
when 2 then convert(nvarchar(32), @head+1)
elseconvert(nvarchar(32), @head+1) + ' To ' + convert(nvarchar(32), @tail -1)
end

Fetch next from MyCursor
into @RecKey, @RecSeq
set @head = @tail   
set @tail = @RecSeq
set @pivot = @RecKey
end

select * from @outfile 

drop table #MyList
close MyCursor
deallocate MyCursor
END

Rate

2.5 (6)

Share

Share

Rate

2.5 (6)