Validar CPF com SQL Server
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.
https://blog.dbins.com.br/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
Se você deseja aprender como fazer a validação do CPF utilizando o MySQL, consulte o link a seguir