Olá pessoal,
Boa noite!

Neste post, vou trazer novamente uma função para validação de inscrição estadual de todos os estados do Brasil, como eu já havia demonstrado no meu post Como validar inscrição estadual usando função T-SQL no SQL Server, mas desta vez, lhes trago a função escrita em C#, para ser utilizada em seus projetos CLR no banco de dados SQL Server ou mesmo em projetos de desenvolvimento C# mesmo, sem ter nada a ver com o CLR ou SQL Server e sem a necessidade de importar bibliotecas externas.

A validação de inscrição estadual é muito importante para quem emite nota fiscal, para financeiras, bancos e comércio em geral e essa informação deve estar sem válida e íntegra, conforme regulamentação da Sefaz e Sintegra.

Achei legal compartilhar essa solução em C# no CLR, porque a performance dela é muito superior à função T-SQL e o código pode ser mais organizado e de fácil entendimento.

Exemplos de utilização da função

-- Validando inscrição estadual da Bahia
SELECT 
    CLR.dbo.fncValida_Inscricao_Estadual('BA', '055540903'),
    CLR.dbo.fncValida_Inscricao_Estadual('BA', '045540903')
 
-- Validando inscrição estadual do Espírito Santo
SELECT 
    CLR.dbo.fncValida_Inscricao_Estadual('ES', '355206196'),
    CLR.dbo.fncValida_Inscricao_Estadual('ES', '355206197')
 
-- Validando inscrição estadual de São Paulo
SELECT 
    CLR.dbo.fncValida_Inscricao_Estadual('SP', '556261170177'),
    CLR.dbo.fncValida_Inscricao_Estadual('SP', '56261170177')
Resultados:

SQL Server - CLR validar inscrição estadual csharp .net
SQL Server - CLR validar inscrição estadual csharp .net

Código-fonte da função de validação

Agora que já mostrei como é fácil validar a inscrição estadual para qualquer estado do Brasil, vou demonstrar o código-fonte, escrito em C#, já pronto para copiar e colar no seu projeto CLR e utilizar a partir de queries no SQL Server:

Visualizar código-fonte da função
using System;
using System.Data.SqlTypes;

public partial class UserDefinedFunctions
{
    [Microsoft.SqlServer.Server.SqlFunction]
    public static SqlBoolean fncValida_Inscricao_Estadual(SqlString Ds_UF, SqlString Ds_Inscricao_Estadual)
    {

        if (Ds_UF.IsNull || Ds_Inscricao_Estadual.IsNull)
            return false;

        if (Ds_UF.Value.Length != 2)
            return false;

        if (Ds_Inscricao_Estadual.Value.Length == 0)
            return false;

        var pUF = Ds_UF.Value;
        var strOrigem = Ds_Inscricao_Estadual.Value.Trim().Replace(".", "").Replace("-", "").Replace("/", "");

        if ((strOrigem.Trim().ToUpper() == "ISENTO"))
            return true;


        try
        {

            switch (pUF.ToUpper())
            {

                case "AC":
                    return fncValida_Inscricao_Estadual_AC(strOrigem);

                case "AL":
                    return fncValida_Inscricao_Estadual_AL(strOrigem);

                case "AM":
                    return fncValida_Inscricao_Estadual_AM(strOrigem);

                case "AP":
                    return fncValida_Inscricao_Estadual_AP(strOrigem);

                case "BA":
                    return fncValida_Inscricao_Estadual_BA(strOrigem);

                case "CE":
                    return fncValida_Inscricao_Estadual_CE(strOrigem);

                case "DF":
                    return fncValida_Inscricao_Estadual_DF(strOrigem);

                case "ES":
                    return fncValida_Inscricao_Estadual_ES(strOrigem);

                case "GO":
                    return fncValida_Inscricao_Estadual_GO(strOrigem);

                case "MA":
                    return fncValida_Inscricao_Estadual_MA(strOrigem);

                case "MT":
                    return fncValida_Inscricao_Estadual_MT(strOrigem);

                case "MS":
                    return fncValida_Inscricao_Estadual_MS(strOrigem);

                case "MG":
                    return fncValida_Inscricao_Estadual_MG(strOrigem);

                case "PA":
                    return fncValida_Inscricao_Estadual_PA(strOrigem);

                case "PB":
                    return fncValida_Inscricao_Estadual_PB(strOrigem);

                case "PE":
                    return fncValida_Inscricao_Estadual_PE(strOrigem);

                case "PI":
                    return fncValida_Inscricao_Estadual_PI(strOrigem);

                case "PR":
                    return fncValida_Inscricao_Estadual_PR(strOrigem);

                case "RJ":
                    return fncValida_Inscricao_Estadual_RJ(strOrigem);

                case "RN":
                    return fncValida_Inscricao_Estadual_RN(strOrigem);

                case "RO":
                    return fncValida_Inscricao_Estadual_RO(strOrigem);

                case "RR":
                    return fncValida_Inscricao_Estadual_RR(strOrigem);

                case "RS":
                    return fncValida_Inscricao_Estadual_RS(strOrigem);

                case "SC":
                    return fncValida_Inscricao_Estadual_SC(strOrigem);

                case "SE":
                    return fncValida_Inscricao_Estadual_SE(strOrigem);

                case "SP":
                    return fncValida_Inscricao_Estadual_SP(strOrigem);

                case "TO":
                    return fncValida_Inscricao_Estadual_TO(strOrigem);

                default:
                    return false;

            }

        }
        catch (Exception e)
        {
            return false;
        }

    }



    private static bool fncValida_Inscricao_Estadual_AC(string Ds_Inscricao_Estadual)
    {

        var strOrigem = Ds_Inscricao_Estadual;
        if (strOrigem.Length != 13 || strOrigem.Substring(0, 2) != "01")
            return false;

        var strBase = strOrigem.Trim();

        if (strBase.Substring(0, 2) != "01") return false;

        var intSoma = 0;
        var intPeso = 4;
        var intValor = 0;

        for (var intPos = 1; (intPos <= 11); intPos++)
        {

            intValor = int.Parse(strBase.Substring((intPos - 1), 1));

            if (intPeso == 1) intPeso = 9;

            intSoma += intValor * intPeso;

            intPeso--;
        }

        var intResto = (intSoma % 11);

        intSoma = 0;
        strBase = (strOrigem.Trim() + "000000000000").Substring(0, 12);
        intPeso = 5;

        for (var intPos = 1; (intPos <= 12); intPos++)
        {
            intValor = int.Parse(strBase.Substring((intPos - 1), 1));

            if (intPeso == 1) intPeso = 9;

            intSoma += intValor * intPeso;
            intPeso--;
        }

        intResto = (intSoma % 11);
        var strDigito2 = ((intResto < 2) ? "0" : Convert.ToString((11 - intResto))).Substring((((intResto < 2) ? "0" : Convert.ToString((11 - intResto))).Length - 1));

        var strBase2 = (strBase.Substring(0, 12) + strDigito2);

        return (strBase2 == strOrigem);
    }

    private static bool fncValida_Inscricao_Estadual_AL(string Ds_Inscricao_Estadual)
    {

        var strOrigem = Ds_Inscricao_Estadual;
        if (strOrigem.Length != 9 || strOrigem.Substring(0, 2) != "24")
            return false;

        var strBase = (strOrigem.Trim() + "000000000").Substring(0, 9);

        if ((strBase.Substring(0, 2) != "24")) return false;

        var intSoma = 0;
        var intPeso = 9;

        for (var intPos = 1; (intPos <= 8); intPos++)
        {

            var intValor = int.Parse(strBase.Substring((intPos - 1), 1));

            intSoma += intValor * intPeso;
            intPeso--;
        }

        intSoma = (intSoma * 10);
        var intResto = (intSoma % 11);

        var strDigito1 = ((intResto == 10) ? "0" : Convert.ToString(intResto)).Substring((((intResto == 10) ? "0" : Convert.ToString(intResto)).Length - 1));

        var strBase2 = (strBase.Substring(0, 8) + strDigito1);

        return strBase2 == strOrigem;
    }

    private static bool fncValida_Inscricao_Estadual_AM(string Ds_Inscricao_Estadual)
    {

        var strOrigem = Ds_Inscricao_Estadual;
        if (strOrigem.Length != 9)
            return false;

        var strBase = (strOrigem.Trim() + "000000000").Substring(0, 9);
        var intSoma = 0;
        var intPeso = 9;

        for (var intPos = 1; (intPos <= 8); intPos++)
        {
            var intValor = int.Parse(strBase.Substring((intPos - 1), 1));

            intSoma += intValor * intPeso;
            intPeso--;
        }

        var intResto = (intSoma % 11);
        var strDigito1 = intSoma < 11 ? (11 - intSoma).ToString() : ((intResto < 2) ? "0" : Convert.ToString((11 - intResto))).Substring((((intResto < 2) ? "0" : Convert.ToString((11 - intResto))).Length - 1));
        var strBase2 = (strBase.Substring(0, 8) + strDigito1);

        return (strBase2 == strOrigem);

    }

    private static bool fncValida_Inscricao_Estadual_AP(string Ds_Inscricao_Estadual)
    {

        var strOrigem = Ds_Inscricao_Estadual;
        if (strOrigem.Length != 9)
            return false;

        var strBase = (strOrigem.Trim() + "000000000").Substring(0, 9);
        var intPeso = 9;

        if (strBase.Substring(0, 2) != "03") return false;

        strBase = (strOrigem.Trim() + "000000000").Substring(0, 9);
        var intSoma = 0;

        int intValor;
        for (var intPos = 1; (intPos <= 8); intPos++)
        {
            intValor = int.Parse(strBase.Substring((intPos - 1), 1));

            intSoma += intValor * intPeso;
            intPeso--;
        }

        var intResto = (intSoma % 11);
        intValor = (11 - intResto);

        var strDigito1 = Convert.ToString(intValor).Substring((Convert.ToString(intValor).Length - 1));
        var strBase2 = (strBase.Substring(0, 8) + strDigito1);

        return strBase2 == strOrigem;
    }

    private static bool fncValida_Inscricao_Estadual_BA(string Ds_Inscricao_Estadual)
    {

        var strOrigem = Ds_Inscricao_Estadual;

        if (strOrigem.Length != 9 && strOrigem.Length != 8)
            return false;

        var strBase = "";

        switch (strOrigem.Length)
        {
            case 8:
                strBase = (strOrigem.Trim() + "00000000").Substring(0, 8);
                break;
            case 9:
                strBase = (strOrigem.Trim() + "00000000").Substring(0, 9);
                break;
        }

        var intSoma = 0;
        int intValor;
        var intPeso = 0;
        int intResto;
        var strDigito1 = "";
        var strDigito2 = "";
        var strBase2 = "";


        #region Validação 8 dígitos
        if (strBase.Length == 8)
        {

            if ((("0123458".IndexOf(strBase.Substring(0, 1), 0, StringComparison.OrdinalIgnoreCase) + 1) > 0))
            {

                for (var intPos = 1; (intPos <= 6); intPos++)
                {
                    intValor = int.Parse(strBase.Substring((intPos - 1), 1));

                    if (intPos == 1) intPeso = 7;

                    intSoma += intValor * intPeso;
                    intPeso--;
                }


                intResto = (intSoma % 10);
                strDigito2 = ((intResto == 0) ? "0" : Convert.ToString((10 - intResto))).Substring((((intResto == 0) ? "0" : Convert.ToString((10 - intResto))).Length - 1));


                strBase2 = strBase.Substring(0, 7) + strDigito2;

                if (strBase2 == strOrigem)
                {

                    intSoma = 0;
                    intPeso = 0;

                    for (var intPos = 1; (intPos <= 7); intPos++)
                    {
                        intValor = int.Parse(strBase.Substring((intPos - 1), 1));

                        if (intPos == 7)
                            intValor = int.Parse(strBase.Substring((intPos), 1));

                        if (intPos == 1) intPeso = 8;

                        intSoma += intValor * intPeso;
                        intPeso--;
                    }


                    intResto = (intSoma % 10);
                    strDigito1 = ((intResto == 0) ? "0" : Convert.ToString((10 - intResto))).Substring((((intResto == 0) ? "0" : Convert.ToString((10 - intResto))).Length - 1));

                    strBase2 = (strBase.Substring(0, 6) + strDigito1 + strDigito2);

                    return strBase2 == strOrigem;

                }

                return false;


            }


            if ((("679".IndexOf(strBase.Substring(0, 1), 0, StringComparison.OrdinalIgnoreCase) + 1) > 0))
            {

                intSoma = 0;

                for (var intPos = 1; (intPos <= 6); intPos++)
                {
                    intValor = int.Parse(strBase.Substring((intPos - 1), 1));

                    if (intPos == 1) intPeso = 7;

                    intSoma += intValor * intPeso;
                    intPeso--;
                }


                intResto = (intSoma % 11);
                strDigito2 = ((intResto == 0) ? "0" : Convert.ToString((11 - intResto))).Substring((((intResto == 0) ? "0" : Convert.ToString((11 - intResto))).Length - 1));


                strBase2 = strBase.Substring(0, 7) + strDigito2;

                if (strBase2 == strOrigem)
                {

                    intSoma = 0;
                    intPeso = 0;

                    for (var intPos = 1; (intPos <= 7); intPos++)
                    {
                        intValor = int.Parse(strBase.Substring((intPos - 1), 1));

                        if (intPos == 7)
                            intValor = int.Parse(strBase.Substring((intPos), 1));

                        if (intPos == 1) intPeso = 8;

                        intSoma += intValor * intPeso;
                        intPeso--;
                    }


                    intResto = (intSoma % 11);
                    strDigito1 = ((intResto == 0) ? "0" : Convert.ToString((11 - intResto))).Substring((((intResto == 0) ? "0" : Convert.ToString((11 - intResto))).Length - 1));

                    strBase2 = (strBase.Substring(0, 6) + strDigito1 + strDigito2);

                    return strBase2 == strOrigem;

                }

                return false;

            }

        }
        #endregion


        #region Validação 9 dígitos
        if (strBase.Length == 9)
        {

            var modulo = (("0123458".IndexOf(strBase.Substring(1, 1), 0, StringComparison.OrdinalIgnoreCase) + 1) > 0) ? 10 : 11;


            intSoma = 0;


            for (var intPos = 1; (intPos <= 7); intPos++)
            {
                intValor = int.Parse(strBase.Substring((intPos - 1), 1));

                if (intPos == 1) intPeso = 8;

                intSoma += intValor * intPeso;
                intPeso--;
            }

            intResto = (intSoma % modulo);

            if (modulo == 11)
                strDigito2 = ((intResto == 0 || intResto == 1) ? "0" : Convert.ToString((modulo - intResto))).Substring((((intResto == 0 || intResto == 1) ? "0" : Convert.ToString((modulo - intResto))).Length - 1));
            else
                strDigito2 = ((intResto == 0) ? "0" : Convert.ToString((modulo - intResto))).Substring((((intResto == 0) ? "0" : Convert.ToString((modulo - intResto))).Length - 1));


            strBase2 = strBase.Substring(0, 8) + strDigito2;

            if (strBase2 == strOrigem)
            {

                intSoma = 0;
                intPeso = 0;

                for (var intPos = 1; (intPos <= 8); intPos++)
                {
                    intValor = int.Parse(strBase.Substring((intPos - 1), 1));

                    if (intPos == 8)
                        intValor = int.Parse(strBase.Substring((intPos), 1));

                    if (intPos == 1) intPeso = 9;

                    intSoma += intValor * intPeso;
                    intPeso--;
                }


                intResto = (intSoma % modulo);

                if (modulo == 11)
                    strDigito1 = ((intResto == 0 || intResto == 1) ? "0" : Convert.ToString((modulo - intResto))).Substring((((intResto == 0 || intResto == 1) ? "0" : Convert.ToString((modulo - intResto))).Length - 1));
                else
                    strDigito1 = ((intResto == 0) ? "0" : Convert.ToString((modulo - intResto))).Substring((((intResto == 0) ? "0" : Convert.ToString((modulo - intResto))).Length - 1));


                strBase2 = (strBase.Substring(0, 7) + strDigito1 + strDigito2);

                return strBase2 == strOrigem;

            }

            return false;


        }
        #endregion

        return false;

    }


    private static bool fncValida_Inscricao_Estadual_CE(string Ds_Inscricao_Estadual)
    {

        var strOrigem = Ds_Inscricao_Estadual;
        if (strOrigem.Length > 9)
            return false;

        while (strOrigem.Length <= 8)
            strOrigem = "0" + strOrigem;

        var strBase = (strOrigem.Trim() + "000000000").Substring(0, 9);
        var intSoma = 0;
        var intValor = 0;

        for (var intPos = 1; (intPos <= 8); intPos++)
        {
            intValor = int.Parse(strBase.Substring((intPos - 1), 1));
            intValor = (intValor * (10 - intPos));
            intSoma = (intSoma + intValor);
        }

        var intResto = (intSoma % 11);
        intValor = (11 - intResto);

        if ((intValor > 9))
            intValor = 0;

        var strDigito1 = Convert.ToString(intValor).Substring((Convert.ToString(intValor).Length - 1));
        var strBase2 = (strBase.Substring(0, 8) + strDigito1);

        return strBase2 == strOrigem;

    }

    private static bool fncValida_Inscricao_Estadual_DF(string Ds_Inscricao_Estadual)
    {

        var strOrigem = Ds_Inscricao_Estadual;
        if (strOrigem.Length != 13 || strOrigem.Substring(0, 3) != "073")
            return false;

        var strBase = (strOrigem.Trim() + "0000000000000").Substring(0, 13);

        var intSoma = 0;
        var intPeso = 2;
        var intValor = 0;

        for (var intPos = 11; (intPos >= 1); intPos = (intPos + -1))
        {
            intValor = int.Parse(strBase.Substring((intPos - 1), 1));
            intValor = (intValor * intPeso);
            intSoma = (intSoma + intValor);
            intPeso = (intPeso + 1);

            if ((intPeso > 9))
                intPeso = 2;
        }

        var intResto = (intSoma % 11);
        var strDigito1 = ((intResto < 2) ? "0" : Convert.ToString((11 - intResto))).Substring((((intResto < 2) ? "0" : Convert.ToString((11 - intResto))).Length - 1));
        var strBase2 = (strBase.Substring(0, 11) + strDigito1);

        intSoma = 0;
        intPeso = 2;

        for (var intPos = 12; (intPos >= 1); intPos = (intPos + -1))
        {
            intValor = int.Parse(strBase.Substring((intPos - 1), 1));
            intValor = (intValor * intPeso);
            intSoma = (intSoma + intValor);
            intPeso = (intPeso + 1);

            if ((intPeso > 9))
                intPeso = 2;
        }

        intResto = (intSoma % 11);
        var strDigito2 = ((intResto < 2) ? "0" : Convert.ToString((11 - intResto))).Substring((((intResto < 2) ? "0" : Convert.ToString((11 - intResto))).Length - 1));
        strBase2 = (strBase.Substring(0, 12) + strDigito2);

        return strBase2 == strOrigem;
    }

    private static bool fncValida_Inscricao_Estadual_ES(string Ds_Inscricao_Estadual)
    {

        var strOrigem = Ds_Inscricao_Estadual;
        if (strOrigem.Length != 9)
            return false;

        var strBase = strOrigem.Trim();
        var intSoma = 0;

        for (var intPos = 1; (intPos <= 8); intPos++)
        {
            var intValor = int.Parse(strBase.Substring((intPos - 1), 1));
            intValor = (intValor * (10 - intPos));
            intSoma = (intSoma + intValor);
        }

        var intResto = (intSoma % 11);
        var strDigito1 = ((intResto < 2) ? "0" : Convert.ToString((11 - intResto))).Substring((((intResto < 2) ? "0" : Convert.ToString((11 - intResto))).Length - 1));
        var strBase2 = (strBase.Substring(0, 8) + strDigito1);

        return strBase2 == strOrigem;

    }

    private static bool fncValida_Inscricao_Estadual_GO(string Ds_Inscricao_Estadual)
    {

        var strOrigem = Ds_Inscricao_Estadual;
        if (strOrigem.Length != 9)
            return false;

        var strBase = (strOrigem.Trim() + "000000000").Substring(0, 9);

        if ((("10,11,15".IndexOf(strBase.Substring(0, 2), 0, StringComparison.OrdinalIgnoreCase) + 1) <= 0))
            return false;

        var intSoma = 0;
        var strDigito1 = "";

        for (var intPos = 1; (intPos <= 8); intPos++)
        {
            var intValor = int.Parse(strBase.Substring((intPos - 1), 1));
            intValor = (intValor * (10 - intPos));
            intSoma = (intSoma + intValor);
        }

        var intResto = (intSoma % 11);

        switch (intResto)
        {
            case 0:
                strDigito1 = "0";
                break;

            case 1:
                var intNumero = int.Parse(strBase.Substring(0, 8));
                strDigito1 = (((intNumero >= 10103105) && (intNumero <= 10119997)) ? "1" : "0").Substring(((((intNumero >= 10103105) && (intNumero <= 10119997)) ? "1" : "0").Length - 1));
                break;

            default:
                strDigito1 = Convert.ToString((11 - intResto)).Substring((Convert.ToString((11 - intResto)).Length - 1));
                break;
        }

        var strBase2 = (strBase.Substring(0, 8) + strDigito1);

        return strBase2 == strOrigem;
    }

    private static bool fncValida_Inscricao_Estadual_MA(string Ds_Inscricao_Estadual)
    {

        var strOrigem = Ds_Inscricao_Estadual;
        if (strOrigem.Length != 9 || strOrigem.Substring(0, 2) != "12")
            return false;

        var strBase = (strOrigem.Trim() + "000000000").Substring(0, 9);
        var intSoma = 0;

        for (var intPos = 1; (intPos <= 8); intPos++)
        {
            var intValor = int.Parse(strBase.Substring((intPos - 1), 1));
            intValor = (intValor * (10 - intPos));
            intSoma = (intSoma + intValor);
        }

        var intResto = (intSoma % 11);
        var strDigito1 = ((intResto < 2) ? "0" : Convert.ToString((11 - intResto))).Substring((((intResto < 2) ? "0" : Convert.ToString((11 - intResto))).Length - 1));
        var strBase2 = (strBase.Substring(0, 8) + strDigito1);

        return strBase2 == strOrigem;

    }

    private static bool fncValida_Inscricao_Estadual_MT(string Ds_Inscricao_Estadual)
    {

        var strOrigem = Ds_Inscricao_Estadual;
        if (strOrigem.Length < 9)
            return false;

        while (strOrigem.Length <= 11)
            strOrigem = "0" + strOrigem;

        var strBase = (strOrigem.Trim() + "0000000000").Substring(0, 10);
        var intSoma = 0;
        var intPeso = 2;

        for (var intPos = 10; intPos >= 1; intPos = (intPos + -1))
        {
            var intValor = int.Parse(strBase.Substring((intPos - 1), 1));
            intValor = (intValor * intPeso);
            intSoma = (intSoma + intValor);
            intPeso = (intPeso + 1);

            if ((intPeso > 9))
                intPeso = 2;
        }

        var intResto = (intSoma % 11);
        var strDigito1 = ((intResto < 2) ? "0" : Convert.ToString((11 - intResto))).Substring((((intResto < 2) ? "0" : Convert.ToString((11 - intResto))).Length - 1));
        var strBase2 = (strBase.Substring(0, 10) + strDigito1);

        return strBase2 == strOrigem;

    }

    private static bool fncValida_Inscricao_Estadual_MS(string Ds_Inscricao_Estadual)
    {

        var strOrigem = Ds_Inscricao_Estadual;
        if (strOrigem.Length != 9 || strOrigem.Substring(0, 2) != "28")
            return false;

        var strBase = (strOrigem.Trim() + "000000000").Substring(0, 9);
        var intSoma = 0;

        for (var intPos = 1; (intPos <= 8); intPos++)
        {
            var intValor = int.Parse(strBase.Substring((intPos - 1), 1));
            intValor = (intValor * (10 - intPos));
            intSoma = (intSoma + intValor);
        }

        var intResto = (intSoma % 11);
        var strDigito1 = ((intResto < 2) ? "0" : Convert.ToString((11 - intResto))).Substring((((intResto < 2) ? "0" : Convert.ToString((11 - intResto))).Length - 1));
        var strBase2 = (strBase.Substring(0, 8) + strDigito1);

        return strBase2 == strOrigem;

    }

    private static bool fncValida_Inscricao_Estadual_MG(string Ds_Inscricao_Estadual)
    {

        var strOrigem = Ds_Inscricao_Estadual;
        if (strOrigem.Length != 13)
            return false;

        if (strOrigem.Substring(0, 2).ToUpper() == "PR")
            return true;

        
        var strBase = (strOrigem.Trim() + "0000000000000").Substring(0, 13);
        var strBase2 = strBase.Substring(0, 3) + "0" + strBase.Substring(3, 9);
        var intNumero = 1;

        var intSoma = 0;

        for (var intPos = 0; intPos < 12; intPos++)
        {

            if (int.Parse(strBase2.Substring(intPos, 1)) * intNumero >= 10)
                intSoma += (int.Parse(strBase2.Substring(intPos, 1)) * intNumero) - 9;
            else
                intSoma += int.Parse(strBase2.Substring(intPos, 1)) * intNumero;

            intNumero = intNumero + 1;

            if (intNumero == 3)
                intNumero = 1;

        }

        intNumero = (int)((Math.Floor((Convert.ToDecimal(intSoma) + 10) / 10) * 10) - intSoma);
        if (intNumero % 10 == 0)
            intNumero = 0;

        if (intNumero != Convert.ToInt32(strOrigem.Substring(11, 1)))
            return false;


        intNumero = 3;
        intSoma = 0;

        for (var intPos = 0; intPos < 12; intPos++)
        {

            intSoma += int.Parse(strOrigem.Substring(intPos, 1)) * intNumero;

            intNumero = intNumero - 1;
            if (intNumero == 1)
                intNumero = 11;

        }

        intNumero = 11 - (intSoma % 11);
        if (intNumero >= 10)
            intNumero = 0;


        return intNumero == Convert.ToInt32(strOrigem.Substring(12, 1));

    }

    private static bool fncValida_Inscricao_Estadual_PA(string Ds_Inscricao_Estadual)
    {

        var strOrigem = Ds_Inscricao_Estadual;
        if (strOrigem.Length != 9 || strOrigem.Substring(0, 2) != "15")
            return false;

        var strBase = (strOrigem.Trim() + "000000000").Substring(0, 9);
        var intSoma = 0;

        for (var intPos = 1; (intPos <= 8); intPos++)
        {
            var intValor = int.Parse(strBase.Substring((intPos - 1), 1));
            intValor = (intValor * (10 - intPos));
            intSoma = (intSoma + intValor);
        }

        var intResto = (intSoma % 11);
        var strDigito1 = ((intResto < 2) ? "0" : Convert.ToString((11 - intResto))).Substring((((intResto < 2) ? "0" : Convert.ToString((11 - intResto))).Length - 1));
        var strBase2 = (strBase.Substring(0, 8) + strDigito1);

        return strBase2 == strOrigem;

    }

    private static bool fncValida_Inscricao_Estadual_PB(string Ds_Inscricao_Estadual)
    {

        var strOrigem = Ds_Inscricao_Estadual;
        if (strOrigem.Length != 9)
            return false;

        var strBase = (strOrigem.Trim() + "000000000").Substring(0, 9);
        var intSoma = 0;
        int intValor;

        for (var intPos = 1; (intPos <= 8); intPos++)
        {
            intValor = int.Parse(strBase.Substring((intPos - 1), 1));
            intValor = (intValor * (10 - intPos));
            intSoma = (intSoma + intValor);
        }

        var intResto = (intSoma % 11);
        intValor = (11 - intResto);

        if ((intValor > 9))
            intValor = 0;

        var strDigito1 = Convert.ToString(intValor).Substring((Convert.ToString(intValor).Length - 1));
        var strBase2 = (strBase.Substring(0, 8) + strDigito1);

        return strBase2 == strOrigem;
        
    }

    private static bool fncValida_Inscricao_Estadual_PE(string Ds_Inscricao_Estadual)
    {

        var strOrigem = Ds_Inscricao_Estadual;
        if (strOrigem.Length != 9)
            return false;

        var strBase = (strOrigem.Trim() + "00000000000000").Substring(0, 14);
        var intSoma = 0;
        var intPeso = 2;
        int intValor;

        for (var intPos = 7; (intPos >= 1); intPos = (intPos + -1))
        {
            intValor = int.Parse(strBase.Substring((intPos - 1), 1));
            intValor = (intValor * intPeso);
            intSoma = (intSoma + intValor);
            intPeso = (intPeso + 1);

            if ((intPeso > 9))
                intPeso = 2;
        }

        var intResto = (intSoma % 11);
        intValor = (11 - intResto);

        if ((intValor >= 10))
            intValor = 0;

        if (intValor != Convert.ToInt32(strOrigem.Substring(7, 1)))
            return false;

        var strDigito1 = Convert.ToString(intValor).Substring((Convert.ToString(intValor).Length - 1));
        var strBase2 = (strBase.Substring(0, 7) + strDigito1);

        if (strBase2 != strOrigem.Substring(0, 8))
            return false;
        
        intSoma = 0;
        intPeso = 2;

        for (var intPos = 8; (intPos >= 1); intPos = (intPos + -1))
        {
            intValor = int.Parse(strBase.Substring((intPos - 1), 1));
            intValor = (intValor * intPeso);
            intSoma = (intSoma + intValor);
            intPeso = (intPeso + 1);

            if ((intPeso > 9))
                intPeso = 2;
        }

        intResto = (intSoma % 11);
        intValor = (11 - intResto);

        if ((intValor >= 10))
            intValor = 0;

        
        return intValor.ToString() == strOrigem.Substring(8, 1);
        
    }

    private static bool fncValida_Inscricao_Estadual_PI(string Ds_Inscricao_Estadual)
    {

        var strOrigem = Ds_Inscricao_Estadual;
        if (strOrigem.Length != 9)
            return false;

        var strBase = (strOrigem.Trim() + "000000000").Substring(0, 9);
        var intSoma = 0;

        for (var intPos = 1; (intPos <= 8); intPos++)
        {
            var intValor = int.Parse(strBase.Substring((intPos - 1), 1));
            intValor = (intValor * (10 - intPos));
            intSoma = (intSoma + intValor);
        }

        var intResto = (intSoma % 11);
        var strDigito1 = ((intResto < 2) ? "0" : Convert.ToString((11 - intResto))).Substring((((intResto < 2) ? "0" : Convert.ToString((11 - intResto))).Length - 1));
        var strBase2 = (strBase.Substring(0, 8) + strDigito1);

        return strBase2 == strOrigem;

    }

    private static bool fncValida_Inscricao_Estadual_PR(string Ds_Inscricao_Estadual)
    {

        var strOrigem = Ds_Inscricao_Estadual;
        if (strOrigem.Length != 10)
            return false;

        var strBase = (strOrigem.Trim() + "0000000000").Substring(0, 10);
        var intSoma = 0;
        var intPeso = 2;
        int intValor;

        for (var intPos = 8; (intPos >= 1); intPos = (intPos + -1))
        {
            intValor = int.Parse(strBase.Substring((intPos - 1), 1));
            intValor = (intValor * intPeso);
            intSoma = (intSoma + intValor);
            intPeso = (intPeso + 1);

            if ((intPeso > 7))
                intPeso = 2;
        }

        var intResto = (intSoma % 11);
        var strDigito1 = ((intResto < 2) ? "0" : Convert.ToString((11 - intResto))).Substring((((intResto < 2) ? "0" : Convert.ToString((11 - intResto))).Length - 1));
        var strBase2 = (strBase.Substring(0, 8) + strDigito1);
        intSoma = 0;
        intPeso = 2;

        for (var intPos = 9; (intPos >= 1); intPos = (intPos + -1))
        {
            intValor = int.Parse(strBase2.Substring((intPos - 1), 1));
            intValor = (intValor * intPeso);
            intSoma = (intSoma + intValor);
            intPeso = (intPeso + 1);

            if ((intPeso > 7))
                intPeso = 2;
        }

        intResto = (intSoma % 11);
        var strDigito2 = ((intResto < 2) ? "0" : Convert.ToString((11 - intResto))).Substring((((intResto < 2) ? "0" : Convert.ToString((11 - intResto))).Length - 1));
        strBase2 = (strBase2 + strDigito2);

        return strBase2 == strOrigem;

    }

    private static bool fncValida_Inscricao_Estadual_RJ(string Ds_Inscricao_Estadual)
    {

        var strOrigem = Ds_Inscricao_Estadual;
        if (strOrigem.Length != 8)
            return false;

        var strBase = (strOrigem.Trim() + "00000000").Substring(0, 8);
        var intSoma = 0;
        var intPeso = 2;

        for (var intPos = 7; (intPos >= 1); intPos = (intPos + -1))
        {
            var intValor = int.Parse(strBase.Substring((intPos - 1), 1));
            intValor = (intValor * intPeso);
            intSoma = (intSoma + intValor);
            intPeso = (intPeso + 1);

            if ((intPeso > 7))
                intPeso = 2;
        }

        var intResto = (intSoma % 11);
        var strDigito1 = ((intResto < 2) ? "0" : Convert.ToString((11 - intResto))).Substring((((intResto < 2) ? "0" : Convert.ToString((11 - intResto))).Length - 1));
        var strBase2 = (strBase.Substring(0, 7) + strDigito1);

        return strBase2 == strOrigem;

    }

    private static bool fncValida_Inscricao_Estadual_RN(string Ds_Inscricao_Estadual)
    {

        var strOrigem = Ds_Inscricao_Estadual;
        var strBase = "";
        switch (strOrigem.Length)
        {
            case 9:
                strBase = (strOrigem.Trim() + "000000000").Substring(0, 9);
                break;

            case 10:
                strBase = (strOrigem.Trim() + "000000000").Substring(0, 10);
                break;
        }

        var intSoma = 0;

        if ((strBase.Substring(0, 2) == "20") && strBase.Length == 9)
        {

            for (var intPos = 1; (intPos <= 8); intPos++)
            {
                var intValor = int.Parse(strBase.Substring((intPos - 1), 1));
                intValor = (intValor * (10 - intPos));
                intSoma = (intSoma + intValor);
            }

            intSoma = (intSoma * 10);
            var intResto = (intSoma % 11);
            var strDigito1 = ((intResto > 9) ? "0" : Convert.ToString(intResto)).Substring((((intResto > 9) ? "0" : Convert.ToString(intResto)).Length - 1));
            var strBase2 = (strBase.Substring(0, 8) + strDigito1);

            return strBase2 == strOrigem;

        }


        if (strBase.Length == 10)
        {
            intSoma = 0;

            for (var intPos = 1; (intPos <= 9); intPos++)
            {
                var intValor = int.Parse(strBase.Substring((intPos - 1), 1));
                intValor = (intValor * (11 - intPos));
                intSoma = (intSoma + intValor);
            }

            intSoma = (intSoma * 10);
            var intResto = (intSoma % 11);
            var strDigito1 = ((intResto > 10) ? "0" : Convert.ToString(intResto)).Substring((((intResto > 10) ? "0" : Convert.ToString(intResto)).Length - 1));
            var strBase2 = (strBase.Substring(0, 9) + strDigito1);

            return strBase2 == strOrigem;

        }

        return false;

    }

    private static bool fncValida_Inscricao_Estadual_RO(string Ds_Inscricao_Estadual)
    {

        var strOrigem = Ds_Inscricao_Estadual;
        if (strOrigem.Length != 14)
            return false;

        var strBase = (strOrigem.Trim() + "000000000").Substring(0, 9);
        var strBase2 = strBase.Substring(3, 5);
        var intSoma = 0;
        int intValor;

        for (var intPos = 1; (intPos <= 5); intPos++)
        {
            intValor = int.Parse(strBase2.Substring((intPos - 1), 1));
            intValor = (intValor * (7 - intPos));
            intSoma = (intSoma + intValor);
        }

        var intResto = (intSoma % 11);
        intValor = (11 - intResto);

        if ((intValor > 9))
            intValor = (intValor - 10);

        var strDigito1 = Convert.ToString(intValor).Substring((Convert.ToString(intValor).Length - 1));
        strBase2 = (strBase.Substring(0, 8) + strDigito1);

        return strBase2 == strOrigem;

    }

    private static bool fncValida_Inscricao_Estadual_RR(string Ds_Inscricao_Estadual)
    {

        var strOrigem = Ds_Inscricao_Estadual;
        if (strOrigem.Length != 9 || strOrigem.Substring(0, 2) != "24")
            return false;

        var strBase = (strOrigem.Trim() + "000000000").Substring(0, 9);
        var intSoma = 0;

        for (var intPos = 1; (intPos <= 8); intPos++)
        {
            var intValor = int.Parse(strBase.Substring((intPos - 1), 1));
            intValor = intValor * intPos;
            intSoma += intValor;
        }

        var intResto = (intSoma % 9);
        var strDigito1 = Convert.ToString(intResto).Substring((Convert.ToString(intResto).Length - 1));
        var strBase2 = (strBase.Substring(0, 8) + strDigito1);

        return strBase2 == strOrigem;

    }

    private static bool fncValida_Inscricao_Estadual_RS(string Ds_Inscricao_Estadual)
    {

        var strOrigem = Ds_Inscricao_Estadual;
        if (strOrigem.Length != 10 || Convert.ToInt32(strOrigem) > 467)
            return false;

        var strBase = (strOrigem.Trim() + "0000000000").Substring(0, 10);
        var intSoma = 0;
        var intPeso = 2;
        var intValor = 0;

        for (var intPos = 9; (intPos >= 1); intPos = (intPos + -1))
        {
            intValor = int.Parse(strBase.Substring((intPos - 1), 1));
            intValor = (intValor * intPeso);
            intSoma = (intSoma + intValor);
            intPeso = (intPeso + 1);

            if ((intPeso > 9))
                intPeso = 2;
        }

        var intResto = (intSoma % 11);
        intValor = (11 - intResto);

        if ((intValor > 9))
            intValor = 0;

        var strDigito1 = Convert.ToString(intValor).Substring((Convert.ToString(intValor).Length - 1));
        var strBase2 = (strBase.Substring(0, 9) + strDigito1);

        return strBase2 == strOrigem;

    }

    private static bool fncValida_Inscricao_Estadual_SC(string Ds_Inscricao_Estadual)
    {

        var strOrigem = Ds_Inscricao_Estadual;
        if (strOrigem.Length != 9)
            return false;

        var strBase = (strOrigem.Trim() + "000000000").Substring(0, 9);
        var intSoma = 0;

        for (var intPos = 1; (intPos <= 8); intPos++)
        {
            var intValor = int.Parse(strBase.Substring((intPos - 1), 1));
            intValor = (intValor * (10 - intPos));
            intSoma = (intSoma + intValor);
        }

        var intResto = (intSoma % 11);
        var strDigito1 = ((intResto < 2) ? "0" : Convert.ToString((11 - intResto))).Substring((((intResto < 2) ? "0" : Convert.ToString((11 - intResto))).Length - 1));
        var strBase2 = (strBase.Substring(0, 8) + strDigito1);

        return strBase2 == strOrigem;
        
    }

    private static bool fncValida_Inscricao_Estadual_SE(string Ds_Inscricao_Estadual)
    {

        var strOrigem = Ds_Inscricao_Estadual;
        if (strOrigem.Length != 9)
            return false;

        var strBase = (strOrigem.Trim() + "000000000").Substring(0, 9);
        var intSoma = 0;
        int intValor;

        for (var intPos = 1; (intPos <= 8); intPos++)
        {
            intValor = int.Parse(strBase.Substring((intPos - 1), 1));
            intValor = (intValor * (10 - intPos));
            intSoma = (intSoma + intValor);
        }

        var intResto = (intSoma % 11);
        intValor = (11 - intResto);

        if ((intValor > 9))
            intValor = 0;

        var strDigito1 = Convert.ToString(intValor).Substring((Convert.ToString(intValor).Length - 1));
        var strBase2 = (strBase.Substring(0, 8) + strDigito1);

        return strBase2 == strOrigem;

    }

    private static bool fncValida_Inscricao_Estadual_SP(string Ds_Inscricao_Estadual)
    {

        var strOrigem = Ds_Inscricao_Estadual;
        string strBase;
        string strBase2;
        int intSoma;
        int intPeso;

        if ((strOrigem.Substring(0, 1) == "P"))
        {
            strBase = (strOrigem.Trim() + "0000000000000").Substring(0, 13);
            intSoma = 0;
            intPeso = 1;

            for (var intPos = 1; (intPos <= 8); intPos++)
            {
                var intValor = int.Parse(strBase.Substring((intPos), 1));
                intValor = (intValor * intPeso);
                intSoma = (intSoma + intValor);
                intPeso = (intPeso + 1);

                if ((intPeso == 2))
                    intPeso = 3;

                if ((intPeso == 9))
                    intPeso = 10;
            }

            var intResto = (intSoma % 11);
            var strDigito1 = Convert.ToString(intResto).Substring((Convert.ToString(intResto).Length - 1));
            strBase2 = (strBase.Substring(0, 9) + (strDigito1 + strBase.Substring(10, 3)));
        }
        else
        {
            strBase = (strOrigem.Trim() + "000000000000").Substring(0, 12);
            intSoma = 0;
            intPeso = 1;

            for (var intPos = 1; (intPos <= 8); intPos++)
            {
                var intValor = int.Parse(strBase.Substring((intPos - 1), 1));
                intValor = (intValor * intPeso);
                intSoma = (intSoma + intValor);
                intPeso = (intPeso + 1);

                if ((intPeso == 2))
                    intPeso = 3;

                if ((intPeso == 9))
                    intPeso = 10;
            }

            var intResto = (intSoma % 11);
            var strDigito1 = Convert.ToString(intResto).Substring((Convert.ToString(intResto).Length - 1));
            strBase2 = (strBase.Substring(0, 8) + (strDigito1 + strBase.Substring(9, 2)));
            intSoma = 0;
            intPeso = 2;

            for (var intPos = 11; (intPos >= 1); intPos = (intPos + -1))
            {
                var intValor = int.Parse(strBase.Substring((intPos - 1), 1));
                intValor = (intValor * intPeso);
                intSoma = (intSoma + intValor);
                intPeso = (intPeso + 1);

                if ((intPeso > 10))
                    intPeso = 2;
            }

            intResto = (intSoma % 11);
            var strDigito2 = Convert.ToString(intResto).Substring((Convert.ToString(intResto).Length - 1));
            strBase2 = (strBase2 + strDigito2);
        }

        return strBase2 == strOrigem;

    }

    private static bool fncValida_Inscricao_Estadual_TO(string Ds_Inscricao_Estadual)
    {

        var strOrigem = Ds_Inscricao_Estadual;
        if (strOrigem.Length != 11 || strOrigem.Substring(2, 2) != "01" || strOrigem.Substring(2, 2) != "02" || strOrigem.Substring(2, 2) != "03" || strOrigem.Substring(2, 2) != "99")
            return false;

        var strBase = (strOrigem.Trim() + "00000000000").Substring(0, 11);
        var strBase2 = (strBase.Substring(0, 2) + strBase.Substring(4, 6));
        var intSoma = 0;

        for (var intPos = 1; (intPos <= 8); intPos++)
        {
            var intValor = int.Parse(strBase2.Substring((intPos - 1), 1));
            intValor = (intValor * (10 - intPos));
            intSoma = (intSoma + intValor);
        }

        var intResto = (intSoma % 11);
        var strDigito1 = ((intResto < 2) ? "0" : Convert.ToString((11 - intResto))).Substring((((intResto < 2) ? "0" : Convert.ToString((11 - intResto))).Length - 1));
        strBase2 = (strBase.Substring(0, 10) + strDigito1);

        return strBase2 == strOrigem;


    }

}

Caso você ainda não saiba o que é o CLR e como utilizar funções escritas em C# (.NET) pelo banco de dados SQL Server, saiba mais acessando o meu post Introdução ao SQL CLR (Common Language Runtime) no SQL Server

É isso aí, pessoal!
Até o próximo post!