IF  EXISTS (SELECT * FROM SYS.OBJECTS WHERE OBJECT_ID = OBJECT_ID(N'[DBO].VALIDA_CNPJ') AND TYPE IN (N'FN', N'IF', N'TF', N'FS', N'FT'))
    DROP FUNCTION [DBO].[VALIDA_CNPJ]
GO 


CREATE FUNCTION [dbo].[VALIDA_CNPJ](@CNPJ VARCHAR(20))
RETURNS CHAR(1)
AS
BEGIN
    DECLARE 
        @I INT,
        @SOMA INT,
        @DIG1 INT,
        @DIG2 INT,
        @VALOR INT,
        @RESULTADO CHAR(1);

    SET @CNPJ = UPPER(LTRIM(RTRIM(@CNPJ)));

    -- Remove máscaras
    SET @CNPJ = REPLACE(@CNPJ, '/', '');
    SET @CNPJ = REPLACE(@CNPJ, '.', '');
    SET @CNPJ = REPLACE(@CNPJ, '-', '');
    SET @CNPJ = REPLACE(@CNPJ, ' ', '');

    IF LEN(@CNPJ) <> 14
        RETURN 'N';

    -- As 12 primeiras posições podem ser número ou letra.
    -- As 2 últimas precisam ser numéricas.
    IF @CNPJ LIKE '%[^0-9A-Z]%'
        RETURN 'N';

    IF SUBSTRING(@CNPJ, 13, 2) LIKE '%[^0-9]%'
        RETURN 'N';

    -- Evita CNPJ zerado
    IF @CNPJ = '00000000000000'
        RETURN 'N';

    --------------------------------------------------------
    -- Primeiro dígito
    -- Pesos: 5 4 3 2 9 8 7 6 5 4 3 2
    --------------------------------------------------------
    SET @SOMA = 0;
    SET @I = 1;

    WHILE @I <= 12
    BEGIN
        SET @VALOR = ASCII(SUBSTRING(@CNPJ, @I, 1)) - 48;

        SET @SOMA = @SOMA + @VALOR *
            CASE @I
                WHEN 1 THEN 5
                WHEN 2 THEN 4
                WHEN 3 THEN 3
                WHEN 4 THEN 2
                WHEN 5 THEN 9
                WHEN 6 THEN 8
                WHEN 7 THEN 7
                WHEN 8 THEN 6
                WHEN 9 THEN 5
                WHEN 10 THEN 4
                WHEN 11 THEN 3
                WHEN 12 THEN 2
            END;

        SET @I = @I + 1;
    END;

    SET @DIG1 = @SOMA % 11;

    IF @DIG1 < 2
        SET @DIG1 = 0;
    ELSE
        SET @DIG1 = 11 - @DIG1;

    --------------------------------------------------------
    -- Segundo dígito
    -- Pesos: 6 5 4 3 2 9 8 7 6 5 4 3 2
    --------------------------------------------------------
    SET @SOMA = 0;
    SET @I = 1;

    WHILE @I <= 13
    BEGIN
        IF @I = 13
            SET @VALOR = @DIG1;
        ELSE
            SET @VALOR = ASCII(SUBSTRING(@CNPJ, @I, 1)) - 48;

        SET @SOMA = @SOMA + @VALOR *
            CASE @I
                WHEN 1 THEN 6
                WHEN 2 THEN 5
                WHEN 3 THEN 4
                WHEN 4 THEN 3
                WHEN 5 THEN 2
                WHEN 6 THEN 9
                WHEN 7 THEN 8
                WHEN 8 THEN 7
                WHEN 9 THEN 6
                WHEN 10 THEN 5
                WHEN 11 THEN 4
                WHEN 12 THEN 3
                WHEN 13 THEN 2
            END;

        SET @I = @I + 1;
    END;

    SET @DIG2 = @SOMA % 11;

    IF @DIG2 < 2
        SET @DIG2 = 0;
    ELSE
        SET @DIG2 = 11 - @DIG2;

    IF @DIG1 = CONVERT(INT, SUBSTRING(@CNPJ, 13, 1))
       AND @DIG2 = CONVERT(INT, SUBSTRING(@CNPJ, 14, 1))
        SET @RESULTADO = 'S';
    ELSE
        SET @RESULTADO = 'N';

    RETURN @RESULTADO;
END;
GO


