FUNÇÃO PARA VERIFICAR INTERVALOS VAZIOS NA TABELA (CAMPO ID) – SQLSERVER

Varias vezes nos deparamos com tabelas onde temos uma sequencia de números, por exemplo ID´s, geração de códigos de barras, etc, do qual “perdemos” algumas sequencias… por ex:

Temos uma tabela de ID´s de 0 a 9, com um total de 10 ID´s disponíveis:

TABELA:

0

1

2

3

4

5

6

7

8

9

 

 

Essa seria a tabela ideal, ou seja, os ID´s estão em sequencia e nenhum ID foi perdido, dos 10 disponíveis.

Agora imagine que isso foi criado de maneira errônea e você precisa descobrir quais não foram gerados, por ex:

TABELA:

0

1

3

4

5

7

8

9

 

Precisamos achar os ID´s que foram perdidos, neste caso acima, os : ( 2 e 6 )

Para isso, esta query abaixo, se ajustada, pode resolver este problema.

declare @min int declare @max int select @min = min(seq_field), @max = max(seq_field) from [Table] create table #tmp (Field_No int) while @min <= @max begin if not exists (select * from [Table] where seq_field = @min) insert into #tmp (seq_field) values (@min) set @min = @min + 1 end select * from #tmp drop table #tmp 

 

Certa vez desenvolvi uma função para me trazer os ID´s ainda não usados, os quais teriam de estar livres em duas tabelas, segue abaixo a função:

 

CREATE FUNCTION dbo.FCN_CODBAR_DISPONIVEL ()
/*GERANDO CODBAR NAO REPETIDOS*/
RETURNS @tableResult table(
CODBAR_NAO_USADO_A int,
CODBAR_NAO_USADO_G int)
AS
BEGIN
declare @minA int;
declare @maxA int;
declare @minG int;
declare @maxG int;
declare @tmpA table (CODBAR_NAO_USADO_A int);
declare @tmpG table (CODBAR_NAO_USADO_G int);

---------------Criando a lista de disponiveis na A
select @minA = min(CODBAR), @maxA = max(CODBAR) from TABELA_A
while @minA <= @maxA
begin
   if not exists (select * from TABELA_A where CODBAR = @minA)
      insert into @tmpA (CODBAR_NAO_USADO_A) values (@minA)
   set @minA = @minA + 1
end
---------------Criando a lista de disponiveis na G
select @minG = min(CODBAR), @maxG = max(CODBAR) from TABELA_G
while @minG <= @maxG
begin
   if not exists (select * from TABELA_G where CODBAR = @minG)
      insert into @tmpG (CODBAR_NAO_USADO_G) values (@minG)
   set @minG = @minG + 1
end
-------------Listando seriais que estao vagos na A e na G (ao mesmo tempo)/ podem ser usados
insert @tableResult
select *
from @tmpA A
inner join @tmpG G on G.CODBAR_NAO_USADO_G = A.CODBAR_NAO_USADO_A

RETURN
END
DROPAR A FUNÇÃO
--drop function FCN_CODBAR_DISPONIVEL
INFORMAÇÕES SOBRE A FUNÇÃO
--select definition from sys.sql_modules where object_id=object_id('FCN_CODBAR_DISPONIVEL')
Rodando a função
SELECT * FROM FCN_CODBAR_DISPONIVEL();

 

 

No comments yet.