(DRAFT) Trabalhando com SQL CLR: Validação de CNPJ e CPF

Validação de CPF:

using System;
using System.Data;
using System.Data.SqlClient;
using System.Data.SqlTypes;
using Microsoft.SqlServer.Server;
using System.Collections.Generic;

public partial class UserDefinedFunctions
{
    [SqlFunction]
    public static SqlBoolean UDF_ValidarCPF(SqlString numero)
    {
        if (numero.IsNull)
            return SqlBoolean.False;

        var cpf = new List<int>(11);

        foreach (var c in numero.Value)
            if (char.IsNumber(c))
                cpf.Add((int)char.GetNumericValue(c));

        if (cpf.Count != 11)
            return SqlBoolean.False;

        var v = new int[2];

        //Nota: Calcula o primeiro dígito de verificação.
        v[0] = 10 * cpf[0] + 9 * cpf[1] + 8 * cpf[2];
        v[0] += 7 * cpf[3] + 6 * cpf[4] + 5 * cpf[5];
        v[0] += 4 * cpf[6] + 3 * cpf[7] + 2 * cpf[8];
        v[0] = 11 - v[0] % 11;
        v[0] = v[0] >= 10 ? 0 : v[0];

        //Nota: Calcula o segundo dígito de verificação.
        v[1] = 11 * cpf[0] + 10 * cpf[1] + 9 * cpf[2];
        v[1] += 8 * cpf[3] + 7 * cpf[4] + 6 * cpf[5];
        v[1] += 5 * cpf[6] + 4 * cpf[7] + 3 * cpf[8];
        v[1] += 2 * v[0];
        v[1] = 11 - v[1] % 11;
        v[1] = v[1] >= 10 ? 0 : v[1];

        //Nota: Verdadeiro se os dígitos de verificação são os esperados.
        return new SqlBoolean(v[0] == cpf[9] && v[1] == cpf[10]);
    }
};
SELECT *
FROM PessoaFisica
WHERE dbo.UDF_ValidarCPF(CPF) = 0

Validação de CNPJ:

using System;
using System.Data;
using System.Data.SqlClient;
using System.Data.SqlTypes;
using Microsoft.SqlServer.Server;
using System.Collections.Generic;

public partial class UserDefinedFunctions
{
    [SqlFunction]
    public static SqlBoolean UDF_ValidarCNPJ(SqlString numero)
    {
        if (numero.IsNull)
            return SqlBoolean.False;

        var cnpj = new List<int>(14);

        //Nota: Removendo não numéricos
        foreach (var c in numero.Value)
            if (char.IsNumber(c))
                cnpj.Add((int)char.GetNumericValue(c));

        if (cnpj.Count != 14)
            return SqlBoolean.False;

        //Nota: Dígitos de verificação.
        var v = new int[2];

        //Nota: Calcula o primeiro dígito de verificação.
        v[0] = 5 * cnpj[0] + 4 * cnpj[1] + 3 * cnpj[2] + 2 * cnpj[3];
        v[0] += 9 * cnpj[4] + 8 * cnpj[5] + 7 * cnpj[6] + 6 * cnpj[7];
        v[0] += 5 * cnpj[8] + 4 * cnpj[9] + 3 * cnpj[10] + 2 * cnpj[11];
        v[0] = 11 - v[0] % 11;
        v[0] = v[0] >= 10 ? 0 : v[0];

        //Nota: Calcula o segundo dígito de verificação.
        v[1] = 6 * cnpj[0] + 5 * cnpj[1] + 4 * cnpj[2] + 3 * cnpj[3];
        v[1] += 2 * cnpj[4] + 9 * cnpj[5] + 8 * cnpj[6] + 7 * cnpj[7];
        v[1] += 6 * cnpj[8] + 5 * cnpj[9] + 4 * cnpj[10] + 3 * cnpj[11];
        v[1] += 2 * v[0];
        v[1] = 11 - v[1] % 11;
        v[1] = v[1] >= 10 ? 0 : v[1];

        //Nota: Verdadeiro se os dígitos de verificação são os esperados.
        return new SqlBoolean(v[0] == cnpj[12] && v[1] == cnpj[13]);
    }
};
SELECT *
FROM PessoaJuridica
WHERE dbo.UDF_ValidarCNPJ(CNPJ) = 0

Artigos relacionados:

Validação de CNPJ e CPF (somente com SQL)
https://sqlfromhell.wordpress.com/2009/11/19/validacao-de-cnpj-e-cpf/

Referências:

Wikipédia – CPF
http://pt.wikipedia.org/wiki/Cpf

Wikipédia – CNPJ
http://pt.wikipedia.org/wiki/Cnpj

Deixe uma resposta

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s