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

 

 

Quer conferir mais dicas sobre banco de dados? Clique aqui e veja mais dicas!
BINS - Blog SQL

 

Conteúdo sobre banco de dados sem complicação!

MySQL - Referência Rápida

 

SQL Server - Referência Rápida

 

SQL vs Mongo

 

 

 

Veja outros conteúdos que podem ser de seu interesse