IF EXISTS (
SELECT *
FROM sys.objects
WHERE object_id = OBJECT_ID(N'[dbo].[usf_valida_cpf]')
AND type IN (N'FN')
)
DROP FUNCTION dbo.usf_valida_cpf;
GO
CREATE FUNCTION dbo.usf_valida_cpf(@cpf varchar(max)) RETURNS bit
AS
-- Nome Artefato/Programa..: usf_valida_cpf.sql
-- Autor(es)...............: Emerson Hermann (emersonhermann [at] gmail.com) O Peregrino (http://www.emersonhermann.blogspot.com) baseado em Script feito por:
-- ........................: Cristiano Martins Alves em http://www.devmedia.com.br
-- Data Inicio ............: 19/05/2011
-- Data Atualizacao........: 21/02/2012
-- Versao..................: 0.02
-- Compilador/Interpretador: T-SQL (Transact SQL)
-- Sistemas Operacionais...: Windows
-- SGBD....................: MS SQL Server 2005/2008
-- Kernel..................: Nao informado!
-- Finalidade..............: Store Procedure (Function) para validar o numero do CPF
-- OBS.....................: A entrada é um varchar e o retorno é um bit, 1 para válido, 0 para inválido e null para nulos
-- ........................:
--
BEGIN
DECLARE @index int,
@sumx int,
@dig1 int,
@dig2 int,
@cpf_temp varchar(11),
@cpfx varchar(11),
@dig_equal bit, --0 para negativa e 1 para afirmativa
@r bit
-- Pre-validacao 1, se e nulo, entao retorna nulo
IF @cpf IS NULL BEGIN
SET @r = NULL
RETURN (@r)
END --fim_se
-- Pre-validacao 2, se e maior que 11 digitos , entao retorna 0
IF LEN(@cpf) > 11 BEGIN
SET @r = 0
RETURN (@r)
END --fim_se
-- Pre-validacao 3, se e tem alguma letra no cpf, entao retorna 0
IF (SELECT CASE WHEN patindex('%[^0-9]%', @cpf) > 0 THEN 1 ELSE 0 END) = 1 BEGIN
SET @r = 0
RETURN (@r)
END --fim_se
-- Pre-validacao 4, se e menor que 11 digitos , pode ser oriundo de bigint, então fazer tratamento de zeros
SET @cpfx = @cpf
IF LEN(@cpf) < 11 BEGIN
SET @cpfx = REPLICATE('0',11-LEN(@cpf))+@cpf
END --fim se
/*
-- Pre-validcao 5, se a sequencia tem numeros iguais, entao retorna 0
Verificando se os digitos sao iguais.
A Principio CPF com todos os numeros iguais sao invalidos,
apesar de validar o calculo do digito verificador
EX: O CPF 00000000000 é inválido, mas pelo calculo seria valido
*/
SET @cpf_temp = SUBSTRING(@cpfx,1,1)
SET @index = 1
SET @dig_equal = 1
WHILE (@index <= 11) BEGIN
IF SUBSTRING(@cpfx,@index,1) <> @cpf_temp BEGIN
SET @dig_equal = 0
END
SET @index = @index + 1
END;
--Caso os digitos nao sejam todos iguais, comeca o calculo dos digitos
IF @dig_equal = 0 BEGIN
--Calculo do 1º digito
SET @sumx = 0
SET @index = 1
WHILE (@index <= 9) BEGIN
SET @sumx = @sumx + CONVERT(int,SUBSTRING(@cpfx,@index,1)) * (11 - @index)
SET @index = @index + 1
END
SET @dig1 = 11 - (@sumx % 11)
IF @dig1 > 9 BEGIN
SET @dig1 = 0
END
-- Calculo do 2º digito
SET @sumx = 0
SET @index = 1
WHILE (@index <= 10) BEGIN
SET @sumx = @sumx + CONVERT(int,SUBSTRING(@cpfx,@index,1)) * (12 - @index)
SET @index = @index + 1
END --fim_enquanto
SET @dig2 = 11 - (@sumx % 11)
IF @dig2 > 9 BEGIN
SET @dig2 = 0
END
-- Validando
IF (@dig1 = SUBSTRING(@cpfx,LEN(@cpfx)-1,1)) AND (@dig2 = SUBSTRING(@cpfx,LEN(@cpfx),1)) BEGIN
SET @r = 1
END ELSE BEGIN --senao
SET @r = 0
END --fim_se
END ELSE BEGIN --senao
SET @r = 0 -- invalido
END --fim_se
RETURN (@r)
END;
GO
-- chamada da function
--SELECT dbo.usf_valida_cpf('80481604472'); -- retorna 1
-- ou
--SELECT dbo.usf_valida_cpf(80481604472); -- retorna 1
-- ou
--SELECT dbo.usf_valida_cpf('05413714793'); -- retorna 1
-- ou
--SELECT dbo.usf_valida_cpf(05413714793); -- retorna 1
DBA, MySql, Oracle, Postgres, SQL Server, DB2, BI, TI, Business Intelligence, Data Science, Machine Learning, IoT, Arduino
terça-feira, 27 de março de 2012
Validar CPF em SQL
Como validar CPF em SQL Server, store function para validar CPF em T-SQL.
Esta store function, foi desenvolvida pensando no armazenamento do CPF em BIGINT, mas pode ser usada facilmente sem adaptações com CPF tipo VARCHAR(11) sem mascaras ou formatações.
Recomendável persistência do CPF em BIGINT por motivo principal de desempenho.
Segue function....
Assinar:
Postar comentários (Atom)
Tem uma API para fazer consulta cpf no site da RFB ? At
ResponderExcluirOlá Thiago, infelizmente não tenho, seria fácil se não tivesse o captcha conforme site do RFB abaixo:
ResponderExcluirhttp://www.receita.fazenda.gov.br/Aplicacoes/ATCTA/CPF/ConsultaPublica.asp
Emerson, muito bom ! Valeu!
ResponderExcluirObrigado pelo crédito Emerson! Grande abraço!
ResponderExcluirEu é quem agradeço :)
Excluir