SQLServer - sp_geracodigo

Top  Previous  Next

CREATE procedure sp_geracodigo  

( @codigo      varchar(30),  -- nome do campo chave da tabela    

  @tabela      varchar(30),  -- nome da tabela

  @codigoemp   varchar(30),  -- nome do campo chave da tabela de empresa 

  @empresa     int,          -- codigo da empresa que o cadastro devera gerar o sequencial        

  @id          int output)   -- codigo gerado

as

  -- Variáveis

  declare @seq int

  declare @cod int

  declare @cmd varchar(200)

 

  -- Seta valor inicial das variáveis

  select @id  = 0

  select @cod = 0

 

  -- Pega o valor do sequencial da tabela que deve ser gerado o codigo

  set @cmd = 'select ' +  @tabela  + ' as seq into sequencia from tb_seq where ' + @codigoemp + ' = ' + cast(@empresa as varchar(5))

  execute(@cmd)

  select @seq = seq from sequencia

  drop table sequencia

 

  -- Guarda todos os código da tabela original em uma temporaria

  if @empresa = 9999

    set @cmd = 'select ' + @codigo + ' as cod into todoscodigos from ' + @tabela + ' where ' + @codigo + ' > ' + cast(@seq as varchar(5)) + ' order by ' + @codigo

  else

    set @cmd = 'select ' + @codigo + ' as cod into todoscodigos from ' + @tabela + ' where ' + @codigo + ' > ' + cast(@seq as varchar(5)) + ' and ' + @codigoemp + ' = ' + cast(@empresa as varchar(5)) +  ' order by ' + @codigo

  execute(@cmd)

  

  -- Procura por um codigo vago

  while exists (select * from todoscodigos)

  begin

    -- Posiciona o primeiro registro

    select top 1 @cod = cod from todoscodigos order by cod

    select @seq = @seq + 1

    if @seq <> @cod

    begin      

      select @id = @seq

      goto fim

    end       

    -- Posiciona no proximo registro

    delete from todoscodigos where cod = @cod

  end

 

  -- Se encontrou um codigo vago o @id é esse código senao é o ultimo mais 1

  fim:

    if @id = 0        

      select @id = @seq + 1

    -- atualiza a tb_seq com o novo codigo

    set @cmd = 'update tb_seq set ' + @tabela + ' = ' + cast(@id as varchar(10)) + ' where ' + @codigoemp + ' = ' + cast(@empresa as varchar(5))

    execute(@cmd)

    drop table todoscodigos

  return

GO