Hola, chicos,
Todo está bien ?
Hoy te estaré presentando algunas funciones que te ayudarán a mejorar las validaciones en tus rutinas, por ejemplo, validar si un CPF en tu base de datos es válido o no.
Validación de código postal
Esta es una validación simple, que simplemente verifica si la cantidad de caracteres es correcta y si toda la cadena ingresada tiene 8 caracteres numéricos. Para una validación más sólida, sugiero que se compre una base de datos en Correos y la función de validación debe realizar una consulta en esa base de datos para confirmar los datos y la veracidad del CEP.
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
Validación de correo electrónico
Esta función valida direcciones utilizando una máscara de validación de correo electrónico. Cadenas como “[correo electrónico protegido]” o “prueba” no serán validados.
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
validación del CPF
Esta función validará el número de dígitos del CPF (debe ser 11), validará que el CPF ingresado no esté en la lista de CPF repetidos, pero que “pasa” las validaciones estándar y calcula y valida el CPF ingresado para identificar si es válido o no.
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
Validación del CNPJ
Esta función validará el número de dígitos del CNPJ (debe ser 14) y realizará el cálculo y validación del CNPJ ingresado para identificar si es válido o no.
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
Validación del CPF y del CNPJ
Esta función tiene como objetivo validar CPF y CNPJ, utilizando las funciones anteriores dependiendo de la cantidad de caracteres del número de documento ingresado.
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
Validación telefónica
Esta función verificará la cantidad de dígitos en el teléfono y si el número ingresado no se compone simplemente de números repetidos.
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
Función adicional
Te habrás dado cuenta que la función para validar teléfono tiene una dependencia que es fncRecupera_Numeros. Esta función está destinada a devolver sólo caracteres numéricos (0 a 9) y una cadena, eliminando cadenas, acentos, caracteres especiales, etc.
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
Si desea descargar directamente el archivo con todos los scripts presentados, haga clic en el enlace
SQL Server: funciones de validación
Eso es todo.
Hasta la próxima.
Comentários (0)
Carregando comentários…