Validar CNPJ com SQL Server
Neste artigo, você vai ver como é possível validar números de CNPJ utilizando o SQL Server.
A validação de dados é algo que pode ser feito pelo frontend do seu sistema, mas, é comum ocorrer casos onde se recebe uma base existente onde os dados não foram validados.
O CNPJ é formado por 14 dígitos numéricos que seguem o formato "##.###.###/####-##". A validação é feita utilizando os 12 primeiros dígitos e através de um cálculo simples, se valida se o resultado corresponde aos dois últimos números.
Caso você queira entender com detalhes qual a lógica utilizada para validar um CNPJ, pode dar uma olhada neste artigo que eu escrevi, lá eu explico como a validação é feita.
Como funciona a lógica de validação do CNPJ?
Vamos criar uma tabela de testes para armazenar nossos CNPJs.
CREATE TABLE [dbo].[CNPJ](
[id] [int] IDENTITY(1,1) NOT NULL,
[CNPJ] [varchar](14) NOT NULL
) ON [PRIMARY]
Vamos popular a tabela com números de CNPJ aleatórios. Para isso, vamos utilizar este site:
https://www.4devs.com.br/gerador_de_cnpj
Gerei 6 números de CNPJ, o primeiro, o terceiro e o quinto são números válidos, os demais tem erros. Em nosso exemplo, os CNPJ estarão armazenados sem pontos ou traços. Vamos inserir estes números em nossa tabela.
INSERT INTO CNPJ (CNPJ) VALUES ('57686536000120');
INSERT INTO CNPJ (CNPJ) VALUES ('23459947000162');
INSERT INTO CNPJ (CNPJ) VALUES ('71842960000147');
INSERT INTO CNPJ (CNPJ) VALUES ('56478820000146');
INSERT INTO CNPJ (CNPJ) VALUES ('58361419000159');
INSERT INTO CNPJ (CNPJ) VALUES ('90530135000155');
Agora, vamos criar uma função, para poder reaproveitar esta lógica no futuro. Abra uma nova janela de consulta e execute o seguinte código:
CREATE FUNCTION [dbo].[validar_CNPJ] ( @CNPJ VARCHAR(14) )
RETURNS BIT
AS
BEGIN
DECLARE
@INDICE INT,
@SOMA INT,
@DIGITO_1 INT,
@DIGITO_2 INT,
@VAR1 INT,
@VAR2 INT,
@DIGITO_1_CNPJ INT,
@DIGITO_2_CNPJ INT,
@NR_DOCUMENTO_AUX CHAR(14),
@RESULTADO CHAR(1)
SET @SOMA = 0
SET @INDICE = 1
SET @RESULTADO = 0
SET @DIGITO_1_CNPJ = SUBSTRING(@CNPJ, LEN(@CNPJ)- 1, 1)
SET @DIGITO_2_CNPJ = SUBSTRING(@CNPJ, LEN(@CNPJ), 1)
/* Verificando se o formato é valido */
SET @NR_DOCUMENTO_AUX = LTRIM(RTRIM(@CNPJ))
IF (@NR_DOCUMENTO_AUX IN ('00000000000000', '11111111111111', '22222222222222', '33333333333333', '44444444444444', '55555555555555', '66666666666666', '77777777777777', '88888888888888', '99999999999999'))
RETURN 0
IF (LEN(@NR_DOCUMENTO_AUX) <> 14)
RETURN 0;
/* Iniciando a validacao */
SET @VAR1 = 5
WHILE ( @INDICE < = 4 )
BEGIN
SET @SOMA = @SOMA + CONVERT(INT, SUBSTRING(@CNPJ, @INDICE, 1)) * @VAR1
SET @INDICE = @INDICE + 1
SET @VAR1 = @VAR1 - 1
END
SET @VAR2 = 9
WHILE ( @INDICE <= 12 )
BEGIN
SET @SOMA = @SOMA + CONVERT(INT, SUBSTRING(@CNPJ, @INDICE, 1)) * @VAR2
SET @INDICE = @INDICE + 1
SET @VAR2 = @VAR2 - 1
END
SET @DIGITO_1 = ( @SOMA % 11 )
/* Primeiro Digito Verificador */
IF @DIGITO_1 < 2
SET @DIGITO_1 = 0;
ELSE
SET @DIGITO_1 = 11 - ( @SOMA % 11 );
SET @INDICE = 1
SET @SOMA = 0
SET @VAR1 = 6
SET @RESULTADO = 0
WHILE ( @INDICE <= 5 )
BEGIN
SET @SOMA = @SOMA + CONVERT(INT, SUBSTRING(@CNPJ, @INDICE, 1)) * @VAR1
SET @INDICE = @INDICE + 1
SET @VAR1 = @VAR1 - 1
END
SET @VAR2 = 9
WHILE ( @INDICE <= 13 )
BEGIN
SET @SOMA = @SOMA + CONVERT(INT, SUBSTRING(@CNPJ, @INDICE, 1)) * @VAR2
SET @INDICE = @INDICE + 1
SET @VAR2 = @VAR2 - 1
END
/* Segundo Digito Verificador */
SET @DIGITO_2 = ( @SOMA % 11 )
IF @DIGITO_2 < 2
SET @DIGITO_2 = 0;
ELSE /* SE O RESTO DA DIVISÃO NÃO FOR < 2*/
SET @DIGITO_2 = 11 - ( @SOMA % 11 );
/* Validando os digitos verificadores calculados com os digitos verificadores do CNPJ informado */
IF (( @DIGITO_1 = @DIGITO_1_CNPJ ) AND ( @DIGITO_2 = @DIGITO_2_CNPJ) )
SET @RESULTADO = 1
ELSE
SET @RESULTADO = 0
RETURN @RESULTADO
END
Agora vamos testar a nossa função, para fazer isso, faremos a seguinte consulta:
SELECT CNPJ, dbo.validar_CNPJ(CNPJ) as resultado FROM CNPJ
Perceba que na coluna resultado foi retornado 1 para os CNPJs válidos e 0 para os inválidos. Se você quiser ver somente os válidos, poderia fazer a consulta desta forma:
select CNPJ from CNPJ where dbo.validar_CNPJ(CNPJ) = 1