Validar CPF com SQL Server

Aprenda a criar uma função para validar o CPF

Neste artigo, você vai ver como é possível validar números de CPF utilizando o SQL Server.

A validação de dados é algo que deve 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 CPF é formado por 11 dígitos numéricos que seguem o formato "###.###.###-##". A validação é feita utilizando os 9 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 CPF, pode dar uma olhada neste artigo que eu escrevi, lá eu explico como a validação é feita.

http://www.dbins.com.br/dica/como-funciona-a-logica-da-validacao-do-cpf

Vamos criar uma tabela de testes para armazenar nossos CPFs.

CREATE TABLE [CPF](

[id] [int] IDENTITY(1,1) NOT NULL,

[CPF] [varchar](11) NULL

) ON [PRIMARY]

 

Vamos popular a tabela com números de CPFs aleatórios. Para isso, vamos utilizar este site:

https://www.4devs.com.br/gerador_de_cpf

Gerei 3 números de CPF, o primeiro, o terceiro e o quinto são números válidos, os demais tem erros. Em nosso exemplo, os CPFs estarão armazenados sem pontos ou traços. Vamos inserir estes números em nossa tabela.

INSERT INTO CPF VALUES ('75392083099');

INSERT INTO CPF VALUES ('75392081099');

INSERT INTO CPF VALUES ('31804409022');

INSERT INTO CPF VALUES ('31804409021');

INSERT INTO CPF VALUES ('17387354006');

INSERT INTO CPF VALUES ('27387354006');

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 validar_CPF(

    @Nr_Documento VARCHAR(11)

)

RETURNS BIT -- 1 = válido, 0 = inválido

WITH SCHEMABINDING

BEGIN

    DECLARE

        @Contador_1 INT,

        @Contador_2 INT,

        @Digito_1 INT,

        @Digito_2 INT,

        @Nr_Documento_Aux VARCHAR(11)

    -- Remove espaços em branco

    SET @Nr_Documento_Aux = LTRIM(RTRIM(@Nr_Documento))

    SET @Digito_1 = 0

    -- Remove os CPFs onde todos os números são iguais

    IF (@Nr_Documento_Aux IN ('00000000000', '11111111111', '22222222222', '33333333333', '44444444444', '55555555555', '66666666666', '77777777777', '88888888888', '99999999999', '12345678909'))

        RETURN 0

     -- O CPF deve ter 11 caracteres.

    IF (LEN(@Nr_Documento_Aux) <> 11)

        RETURN 0

    ELSE 

    BEGIN

         -- Cálculo do primeiro dígito verificador

        SET @Nr_Documento_Aux = SUBSTRING(@Nr_Documento_Aux, 1, 9)

         SET @Contador_1 = 2

         WHILE (@Contador_1 < = 10)

        BEGIN 

            SET @Digito_1 = @Digito_1 + (@Contador_1 * CAST(SUBSTRING(@Nr_Documento_Aux, 11 - @Contador_1, 1) as int))

            SET @Contador_1 = @Contador_1 + 1

        end 

        SET @Digito_1 = @Digito_1 - (@Digito_1/11)*11

        IF (@Digito_1 <= 1)

            SET @Digito_1 = 0

        ELSE 

            SET @Digito_1 = 11 - @Digito_1

        SET @Nr_Documento_Aux = @Nr_Documento_Aux + CAST(@Digito_1 AS VARCHAR(1))

        IF (@Nr_Documento_Aux <> SUBSTRING(@Nr_Documento, 1, 10))

            RETURN 0

        ELSE BEGIN 

            -- Cálculo do segundo dígito verificador

            SET @Digito_2 = 0

            SET @Contador_2 = 2

            WHILE (@Contador_2 < = 11)

            BEGIN 

                SET @Digito_2 = @Digito_2 + (@Contador_2 * CAST(SUBSTRING(@Nr_Documento_Aux, 12 - @Contador_2, 1) AS INT))

                SET @Contador_2 = @Contador_2 + 1

            end 

            SET @Digito_2 = @Digito_2 - (@Digito_2/11)*11

            IF (@Digito_2 < 2)

                SET @Digito_2 = 0

            ELSE 

                SET @Digito_2 = 11 - @Digito_2

            SET @Nr_Documento_Aux = @Nr_Documento_Aux + CAST(@Digito_2 AS VARCHAR(1))

            IF (@Nr_Documento_Aux <> @Nr_Documento)

                RETURN 0

        END

    END 

    RETURN 1

END

Agora vamos testar a nossa função, para fazer isso, faremos a seguinte consulta:

select CPF, dbo.validar_CPF(CPF) as resultado from CPF

Perceba que na coluna resultado foi retornado 1 para os CPFs válidos e 0 para os inválidos. Se você quiser ver somente os válidos, poderia fazer a consulta desta forma:

select CPF from CPF where dbo.validar_CPF(CPF) = 1

 

 

Quer conferir mais dicas sobre banco de dados? Clique aqui e veja mais dicas!