CREATE PROCEDURE dbo.stpGerador_CPF_CNPJ (
@Quantidade INT = 1,
@Fl_Tipo BIT = 1
)
AS BEGIN
IF (OBJECT_ID('tempdb..#Tabela_Final') IS NOT NULL) DROP TABLE #Tabela_Final
CREATE TABLE #Tabela_Final (
Nr_Documento VARCHAR(18)
)
DECLARE
@n INT,
@n1 INT,
@n2 INT,
@n3 INT,
@n4 INT,
@n5 INT,
@n6 INT,
@n7 INT,
@n8 INT,
@n9 INT,
@n10 INT,
@n11 INT,
@n12 INT,
@d1 INT,
@d2 INT
-- CPF
IF (@Fl_Tipo = 0)
BEGIN
WHILE (@Quantidade > 0)
BEGIN
SET @n = 9
SET @n1 = CAST(( @n + 1 ) * RAND(CAST(NEWID() AS VARBINARY )) AS INT)
SET @n2 = CAST(( @n + 1 ) * RAND(CAST(NEWID() AS VARBINARY )) AS INT)
SET @n3 = CAST(( @n + 1 ) * RAND(CAST(NEWID() AS VARBINARY )) AS INT)
SET @n4 = CAST(( @n + 1 ) * RAND(CAST(NEWID() AS VARBINARY )) AS INT)
SET @n5 = CAST(( @n + 1 ) * RAND(CAST(NEWID() AS VARBINARY )) AS INT)
SET @n6 = CAST(( @n + 1 ) * RAND(CAST(NEWID() AS VARBINARY )) AS INT)
SET @n7 = CAST(( @n + 1 ) * RAND(CAST(NEWID() AS VARBINARY )) AS INT)
SET @n8 = CAST(( @n + 1 ) * RAND(CAST(NEWID() AS VARBINARY )) AS INT)
SET @n9 = CAST(( @n + 1 ) * RAND(CAST(NEWID() AS VARBINARY )) AS INT)
SET @d1 = @n9 * 2 + @n8 * 3 + @n7 * 4 + @n6 * 5 + @n5 * 6 + @n4 * 7 + @n3 * 8 + @n2 * 9 + @n1 * 10
SET @d1 = 11 - ( @d1 % 11 )
IF ( @d1 >= 10 )
SET @d1 = 0
SET @d2 = @d1 * 2 + @n9 * 3 + @n8 * 4 + @n7 * 5 + @n6 * 6 + @n5 * 7 + @n4 * 8 + @n3 * 9 + @n2 * 10 + @n1 * 11
SET @d2 = 11 - ( @d2 % 11 )
IF ( @d2 >= 10 )
SET @d2 = 0
INSERT INTO #Tabela_Final
SELECT CAST(@n1 AS VARCHAR) + CAST(@n2 AS VARCHAR) + CAST(@n3 AS VARCHAR) + '.' + CAST(@n4 AS VARCHAR) + CAST(@n5 AS VARCHAR) + CAST(@n6 AS VARCHAR) + '.' + CAST(@n7 AS VARCHAR) + CAST(@n8 AS VARCHAR) + CAST(@n9 AS VARCHAR) + '-' + CAST(@d1 AS VARCHAR) + CAST(@d2 AS VARCHAR)
SET @Quantidade = @Quantidade - 1
END
END
-- CNPJ
ELSE BEGIN
WHILE (@Quantidade > 0)
BEGIN
SET @n = 9
SET @n1 = CAST(( @n + 1 ) * RAND(CAST(NEWID() AS VARBINARY )) AS INT)
SET @n2 = CAST(( @n + 1 ) * RAND(CAST(NEWID() AS VARBINARY )) AS INT)
SET @n3 = CAST(( @n + 1 ) * RAND(CAST(NEWID() AS VARBINARY )) AS INT)
SET @n4 = CAST(( @n + 1 ) * RAND(CAST(NEWID() AS VARBINARY )) AS INT)
SET @n5 = CAST(( @n + 1 ) * RAND(CAST(NEWID() AS VARBINARY )) AS INT)
SET @n6 = CAST(( @n + 1 ) * RAND(CAST(NEWID() AS VARBINARY )) AS INT)
SET @n7 = CAST(( @n + 1 ) * RAND(CAST(NEWID() AS VARBINARY )) AS INT)
SET @n8 = CAST(( @n + 1 ) * RAND(CAST(NEWID() AS VARBINARY )) AS INT)
SET @n9 = 0
SET @n10 = 0
SET @n11 = 0
SET @n12 = 1
SET @d1 = @n12 * 2 + @n11 * 3 + @n10 * 4 + @n9 * 5 + @n8 * 6 + @n7 * 7 + @n6 * 8 + @n5 * 9 + @n4 * 2 + @n3 * 3 + @n2 * 4 + @n1 * 5
SET @d1 = 11 - ( @d1 % 11 )
IF (@d1 >= 10)
SET @d1 = 0
SET @d2 = @d1 * 2 + @n12 * 3 + @n11 * 4 + @n10 * 5 + @n9 * 6 + @n8 * 7 + @n7 * 8 + @n6 * 9 + @n5 * 2 + @n4 * 3 + @n3 * 4 + @n2 * 5 + @n1 * 6
SET @d2 = 11 - ( @d2 % 11 )
IF (@d2 >= 10)
SET @d2 = 0
INSERT INTO #Tabela_Final
SELECT '' + CAST(@n1 AS VARCHAR) + CAST (@n2 AS VARCHAR) + '.' + CAST (@n3 AS VARCHAR) + CAST (@n4 AS VARCHAR) + CAST (@n5 AS VARCHAR) + '.' + CAST (@n6 AS VARCHAR) + CAST (@n7 AS VARCHAR) + CAST (@n8 AS VARCHAR) + '/' + CAST (@n9 AS VARCHAR) + CAST (@n10 AS VARCHAR) + CAST (@n11 AS VARCHAR) + CAST (@n12 AS VARCHAR) + '-' + CAST (@d1 AS VARCHAR) + CAST (@d2 AS VARCHAR);
SET @Quantidade = @Quantidade - 1
END
END
SELECT * FROM #Tabela_Final
END
Muito bom obrigado por compartilhar. També uso esse site para gerar CNPJ https://toolzinho.com/pt-br/tool/generate-cnpj também tem outras ferramentas úteis.
Valeu Dirceu, bem útil. Fiz uma adaptação para o Postgre que funciona um pouco diferente. Se você não se incomodar, vou colocar aqui como agradecimento e colaboração com a comunidade:
/**********************
Gera números aleatórios de CPF e de CNPJ
Quando “tipo” for:
1: CPF sem máscara
2: CNPJ sem máscara
3: CPF com máscara
4: CNPJ com máscara
*/
create or replace function cpf_cnpj_genarator(tipo integer) returns varchar(20)
language plpgsql
as
$$
DECLARE
n integer;
n1 integer;
n2 integer;
n3 integer;
n4 integer;
n5 integer;
n6 integer;
n7 integer;
n8 integer;
n9 integer;
n10 integer;
n11 integer;
n12 integer;
d1 integer;
d2 integer;
BEGIN
n = 9;
n1 = floor(random() * 10)::int;
n2 = floor(random() * 10)::int;
n3 = floor(random() * 10)::int;
n4 = floor(random() * 10)::int;
n5 = floor(random() * 10)::int;
n6 = floor(random() * 10)::int;
n7 = floor(random() * 10)::int;
n8 = floor(random() * 10)::int;
n9 = floor(random() * 10)::int;
— CPF
IF tipo in (1,3) then
d1 = n9 * 2 + n8 * 3 + n7 * 4 + n6 * 5 + n5 * 6 + n4 * 7 + n3 * 8 + n2 * 9 + n1 * 10;
d1 = 11 – ( d1 % 11 );
IF ( d1 >= 10 ) then
d1 = 0;
end if;
d2 = d1 * 2 + n9 * 3 + n8 * 4 + n7 * 5 + n6 * 6 + n5 * 7 + n4 * 8 + n3 * 9 + n2 * 10 + n1 * 11;
d2 = 11 – ( d2 % 11 );
IF ( d2 >= 10 ) then
d2 = 0;
end if;
return n1::varchar ||
n2::varchar ||
n3::varchar ||
case when tipo = 3 then ‘.’ else ” end ||
n4::varchar ||
n5::varchar ||
n6::varchar ||
case when tipo = 3 then ‘.’ else ” end ||
n7::varchar ||
n8::varchar ||
n9::varchar ||
case when tipo = 3 then ‘-‘ else ” end ||
d1::varchar ||
d2::varchar;
— CNPJ
else
n9 = 0;
n10 = 0;
n11 = 0;
n12 = 1;
d1 = n12 * 2 + n11 * 3 + n10 * 4 + n9 * 5 + n8 * 6 + n7 * 7 + n6 * 8 + n5 * 9 + n4 * 2 + n3 * 3 + n2 * 4 + n1 * 5;
d1 = 11 – ( d1 % 11 );
IF (d1 >= 10) then
d1 = 0;
end if;
d2 = d1 * 2 + n12 * 3 + n11 * 4 + n10 * 5 + n9 * 6 + n8 * 7 + n7 * 8 + n6 * 9 + n5 * 2 + n4 * 3 + n3 * 4 + n2 * 5 + n1 * 6;
d2 = 11 – ( d2 % 11 );
IF (d2 >= 10) then
d2 = 0;
end if;
return n1::varchar ||
n2::varchar ||
case when tipo = 4 then ‘.’ else ” end ||
n3::varchar ||
n4::varchar ||
n5::varchar ||
case when tipo = 4 then ‘.’ else ” end ||
n6::varchar ||
n7::varchar ||
n8::varchar ||
case when tipo = 4 then ‘/’ else ” end ||
n9::varchar ||
n10::varchar ||
n11::varchar ||
n12::varchar ||
case when tipo = 4 then ‘-‘ else ” end ||
d1::varchar ||
d2::varchar;
end if;
END
$$;
Oi Dirceu, esse código foi bem útil. Ate agora só vi geradores em php, vba e javascript. Irei usar o snippet em projetos futuros que requeiram sql. Obrigado.
Estou utilizando para fazer meus testes. Muito obrigado. Uma dúvida. Criei uma procedure para fazer inserts em uma tabela. A tabela com codFunc, Nome, salario e cpf. Como posso incluir sua procedure de gerar cpf válidos automaticamente dentro da minha? Obrigado
Dirceu, boa tarde.
Parabéns pelo código, com certeza muito útil e importante.