Olá pessoal,
Tudo bem ?
Hoje estarei apresentando algumas funções que vão ajudá-los a melhorar validações em suas rotinas, como por exemplo, validar de um CPF da sua base é válido ou não.
Validação de CEP
Essa é uma validação simples, que apenas verifica se a quantidade de caracteres está correta e se todos a string informada possui 8 caracteres numéricos. Para uma validação mais forte, sugiro que seja adquirido uma base junto aos Correios e a função de validação deverá realizar uma consulta nessa base para confirmar os dados e a veracidade do CEP.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
CREATE FUNCTION [dbo].[fncVerifica_Cep](@Nr_Cep CHAR(8)) RETURNS BIT AS BEGIN DECLARE @chr CHAR, @tamanho INT -- Verifica se possui 8 caracteres IF (LEN(@Nr_Cep) < 8) RETURN 0 WHILE (LEN(@Nr_Cep) > 0) BEGIN SELECT @tamanho = LEN(@Nr_Cep), @chr = LEFT(@Nr_Cep,1) -- Verifica se o número informado possui apenas números IF CHARINDEX(@chr,'0123456789') = 0 BEGIN RETURN 0 BREAK END SET @Nr_Cep = STUFF(@Nr_Cep,1,1,'') -- retira o primeiro dígito END RETURN 1 END |
Validação de e-mail
Essa função faz uma validação de endereços utilizando uma máscara de validação de e-mails. Strings como “[email protected]” ou “teste” não serão validadas.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
CREATE FUNCTION dbo.fncValidarEmail(@Ds_Email varchar(max)) RETURNS BIT AS BEGIN DECLARE @Retorno BIT = 0 SELECT @Retorno = 1 WHERE @Ds_Email NOT LIKE '%[^a-z,0-9,@,.,_,-]%' AND @Ds_Email LIKE '%_@_%_.__%' AND @Ds_Email NOT LIKE '%_@@_%_.__%' RETURN @Retorno END |
Validação de CPF
Essa função irá validar a quantidade de dígitos do CPF (precisa ter 11), validar se o CPF informado não está na lista de CPF’s repetidos, mas que “passam” pelas validações padrão e faz o cálculo e validação do CPF informado para identificar se é válido ou não.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 |
CREATE FUNCTION [dbo].[fncValida_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 números que funcionam como validação para CPF, pois eles "passam" pela regra de validação IF (@Nr_Documento_Aux IN ('00000000000', '11111111111', '22222222222', '33333333333', '44444444444', '55555555555', '66666666666', '77777777777', '88888888888', '99999999999', '12345678909')) RETURN 0 -- Verifica se possui apenas 11 caracteres IF (LEN(@Nr_Documento_Aux) <> 11) RETURN 0 ELSE BEGIN -- Cálculo do segundo dígito 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 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 |
Validação de CNPJ
Essa função irá validar a quantidade de dígitos do CNPJ (precisa ter 14) e realizar o cálculo e validação do CNPJ informado para identificar se é válido ou não.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 |
CREATE FUNCTION [dbo].[fncValida_CNPJ] ( @CNPJ VARCHAR(14) ) RETURNS BIT AS BEGIN DECLARE @INDICE INT, @SOMA INT, @DIG1 INT, @DIG2 INT, @VAR1 INT, @VAR2 INT, @RESULTADO CHAR(1) SET @SOMA = 0 SET @INDICE = 1 SET @RESULTADO = 0 SET @VAR1 = 5 /* 1a Parte do Algorítimo começando de "5" */ WHILE ( @INDICE < = 4 ) BEGIN SET @SOMA = @SOMA + CONVERT(INT, SUBSTRING(@CNPJ, @INDICE, 1)) * @VAR1 SET @INDICE = @INDICE + 1 /* Navegando um-a-um até < = 4, as quatro primeira posições */ SET @VAR1 = @VAR1 - 1 /* subtraindo o algorítimo de 5 até 2 */ 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 @DIG1 = ( @SOMA % 11 ) /* SE O RESTO DA DIVISÃO FOR < 2, O DIGITO = 0 */ IF @DIG1 < 2 SET @DIG1 = 0; ELSE /* SE O RESTO DA DIVISÃO NÃO FOR < 2*/ SET @DIG1 = 11 - ( @SOMA % 11 ); SET @INDICE = 1 SET @SOMA = 0 SET @VAR1 = 6 /* 2a Parte do Algorítimo começando de "6" */ SET @RESULTADO = 0 WHILE ( @INDICE <= 5 ) BEGIN SET @SOMA = @SOMA + CONVERT(INT, SUBSTRING(@CNPJ, @INDICE, 1)) * @VAR1 SET @INDICE = @INDICE + 1 /* Navegando um-a-um até < = 5, as quatro primeira posições */ SET @VAR1 = @VAR1 - 1 /* subtraindo o algorítimo de 6 até 2 */ END /* CÁLCULO DA 2ª PARTE DO ALGORÍTIOM 98765432 */ 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 SET @DIG2 = ( @SOMA % 11 ) /* SE O RESTO DA DIVISÃO FOR < 2, O DIGITO = 0 */ IF @DIG2 < 2 SET @DIG2 = 0; ELSE /* SE O RESTO DA DIVISÃO NÃO FOR < 2*/ SET @DIG2 = 11 - ( @SOMA % 11 ); IF ( @DIG1 = SUBSTRING(@CNPJ, LEN(@CNPJ) - 1, 1) ) AND ( @DIG2 = SUBSTRING(@CNPJ, LEN(@CNPJ), 1) ) SET @RESULTADO = 1 ELSE SET @RESULTADO = 0 RETURN @RESULTADO END |
Validação de CPF e CNPJ
Essa função tem por objetivo, realizar a validação de CPF e CNPJ, utilizando as funções acima dependendo da quantidade de caracteres do Nº de documento informado.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
CREATE FUNCTION [dbo].[fncValida_Documento] ( @Nr_Documento VARCHAR(14) ) RETURNS BIT AS BEGIN DECLARE @Retorno BIT = 0 IF (LEN(@Nr_Documento) = 11) BEGIN -- Valida CPF IF (@Nr_Documento IN ('00000000000', '11111111111', '22222222222', '33333333333', '44444444444', '55555555555', '66666666666', '77777777777', '88888888888', '99999999999', '12345678909')) SET @Retorno = 0 ELSE SET @Retorno = CLR.dbo.fncValida_CPF(@Nr_Documento) END ELSE BEGIN -- Valida CNPJ IF (LEN(@Nr_Documento) = 14) SET @Retorno = CLR.dbo.fncValida_CNPJ(@Nr_Documento) ELSE SET @Retorno = 0 END RETURN @Retorno END |
Validação de Telefone
Essa função irá verificar a quantidade de dígitos do telefone e se o número informado não é formado apenas por números repetidos.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 |
CREATE FUNCTION [dbo].[fncValida_Telefone] (@Nr_Telefone VARCHAR(15)) RETURNS BIT AS BEGIN DECLARE @Retorno BIT = 1, @Nr_Telefone_Valida VARCHAR(15) -- Verifica se possui caracteres não numéricos SET @Nr_Telefone_Valida = dbo.fncRecupera_Numeros(@Nr_Telefone) IF (@Nr_Telefone != @Nr_Telefone_Valida) SET @Retorno = 0 -- Verifica a quantidade de digitos SET @Nr_Telefone_Valida = (CASE WHEN LEN(@Nr_Telefone) = 8 THEN @Nr_Telefone WHEN LEN(@Nr_Telefone) = 9 THEN @Nr_Telefone WHEN LEN(@Nr_Telefone) = 10 THEN RIGHT(@Nr_Telefone,8) WHEN LEN(@Nr_Telefone) = 11 THEN RIGHT(@Nr_Telefone,9) ELSE NULL END) -- Verifica se possui apenas números repetidos IF(RIGHT(@Nr_Telefone_Valida, 8) IN ('99999999','88888888','77777777','66666666','55555555','44444444','33333333','22222222','11111111','00000000')) SET @Retorno = 0 -- Verifica se é string vazia IF (@Nr_Telefone_Valida IS NULL) SET @Retorno = 0 RETURN @Retorno END |
Função extra
Vocês devem ter notado que a função para validar telefone possui uma dependência, que é a fncRecupera_Numeros. Essa função tem por finalidade, retornar apenas caracteres numéricos (0 a 9) e uma string, removendo strings, acentos, caracteres especiais, etc.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
CREATE FUNCTION [dbo].[fncRecupera_Numeros] ( @str VARCHAR(500) ) RETURNS VARCHAR(500) BEGIN DECLARE @startingIndex INT SET @startingIndex = 0 WHILE (1 = 1) BEGIN SET @startingIndex = PATINDEX('%[^0-9]%', @str) IF @startingIndex <> 0 SET @str = REPLACE(@str, SUBSTRING(@str, @startingIndex, 1), '') ELSE BREAK END RETURN @str END |
Se quiser baixar direto o arquivo com todos os scripts apresentados, clique no link
SQL Server – Funções de Validação
É isso aí.
Até a próxima.
Boa tarde, preciso de uma PROCEDURE para validar o RENAVAM
Muito bom e muito útil!
Parabéns e muito obrigado!
Eu trabalho com ETL e pego bancos muito poluídos, então tomei a liberdade de acrescentar a condição que verifica se o campo não esta vazio:
— Verifica se É NULL
IF ((@Nr_Documento_Aux) IS NULL)
RETURN 0
[]’s
Show de bola Dirceu, utilizei o validado de CPF e CNPJ.
Só precisei colocar um ajuste para excluir possíveis caracteres de pontuação.
Coloquei logo no inicio da fncValida_Documento:
DECLARE @DOC VARCHAR(14) = ”
;WITH SPLIT AS (
SELECT 1 AS ID, SUBSTRING(@Nr_Documento, 1, 1) AS ALGARISMO
UNION ALL
SELECT ID + 1, SUBSTRING(@Nr_Documento, ID + 1, 1)
FROM SPLIT
WHERE ID < LEN(@Nr_Documento)
)
SELECT @DOC += ALGARISMO FROM SPLIT WHERE ALGARISMO LIKE '[0-9]'
SET @Nr_Documento = @DOC
Opa, que bom que você gostou 🙂
Show suas funções, porém e-mails com ‘-‘ como [email protected] e [email protected] estão voltando como inválidos.
Sabe me dizer porque?
João Paulo,
Obrigado pelo feedback. Validei o script e realmente eu havia esquecido de adicionar o caractere “-“. Agora o script está certinho. Abraço!
A function de validação de e-mail tá deixando passar e-mails tipo ‘alex@@gmail.com’, resolve se adicionar o filtro (AND @Email NOT LIKE ‘%_@@_%_.__%’).
Muito bom mesmo vlw por compartilhar, só tá dando um erro ” [Err] 42000 – [SQL Server]Cannot assign a default value to a local variable.
42000 – [SQL Server]Must declare the variable ‘@Retorno’. ” quando tento instalar a Validação de CPF e CNPJ
O Email [email protected] retorna como válido, e está incorreto devido ao ponto (.) que tem após o arroba (@)
Bom dia Amigo. Gostei das validações. No email precisei fazer um pequeno ajuste para passar email com _ (underline):
CREATE FUNCTION dbo.fncValidarEmail(@Ds_Email varchar(max))
RETURNS BIT
AS BEGIN
DECLARE @Retorno BIT = 0
SELECT @Retorno = 1
WHERE @Ds_Email NOT LIKE ‘%[^a-z,0-9,@,._-]%’
AND @Ds_Email LIKE ‘%_@_%_.__%’
RETURN @Retorno
END
Ivan,
Boa tarde.
Obrigado pelo feedback e pela dica o underline (_). Já alterei o post para adicionar esse caractere na validação.
A rotina de validação de email pela expressão não reconhece, por exemplo, [email protected] como válido!
Thiago,
Bom dia.
Obrigado pela visita e pelo feedback. Já fiz a correção da regra no post para incluir o caractere “-“.
Obrigado!
Dirceu agora foi! Seu blog é show de bola…Ensina a fazer uns pacotes no integration com relatorios no Reporting Services….e muito interessante essa parte de ETL e todo mundo so ensina o basicao….qual seu canal no youtube?
Dirceu todas functions rodei normalmente meu sql 2012 porém a telefone (função extra) está retornando erros…
Msg 4145, Level 15, State 1, Procedure fncRecupera_Numeros, Line 12
An expression of non-boolean type specified in a context where a condition is expected, near ‘;’.
Msg 156, Level 15, State 1, Procedure fncRecupera_Numeros, Line 14
Incorrect syntax near the keyword ‘ELSE’.
André,
Obrigado pela visita e pelo feedback.
Fiz uma mudança no plugin de Syntax Highlighting e alguns posts antigos estão com um problema de “<" e ">” estarem sendo substituídos por suas respectivas entidades HTML (“<” e “>”)
Atualizei os códigos desse post e agora você já irá conseguir compilar a função.
Abraço.
Não está validando corretamente CNPJ que começam com ‘0’
Cristian, poderia me dar um exemplo, por favor ?