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.