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 |