Algumas vezes precisamos mover algumas regras de negócio para dentro do banco de dados por n razões. Certa vez eu estava trabalhando em um mecanismo de importação de dados, que utilizava como fonte arquivos plain text e algumas validações de dados eram feitas diretamente na stored procedure que realizava o insert/update.

Uma das validações era para verificar se o CNPJ estava correto. A forma mais simples foi criar uma sql function para que pudesse verificar diretamente na tabela temporaria do bulk insert se o número estava correto ou não.

O script é o seguinte:

CREATE FUNCTION f_VerificaCNPJ (@CNPJ varchar(14))
RETURNS varchar(14)
AS
BEGIN
  DECLARE @CNPJt varchar (14)
  DECLARE @FatorMultiplicacao_fase1 varchar(12)
  DECLARE @FatorMultiplicacao_fase2 varchar(13)

  DECLARE @Resultado int
  DECLARE @cont int

  DECLARE @DigitoVerificador1 int
  DECLARE @DigitoVerificador2 int

  -- Inicializa variaveis
  SET @cont = 0
  SET @Resultado = 0
  SET @DigitoVerificador1 = 0
  SET @DigitoVerificador2 = 0
  SET @CNPJt = substring(@CNPJ, 1, 12)

  -- Fator multiplicativo que deve ser aplicado sobre o CNPJ
  -- para obtenção do código verificador
  -- valor constante!
  SET @FatorMultiplicacao_fase1 = '543298765432' -- #1
  SET @FatorMultiplicacao_fase2 = '6543298765432' -- #2

  -- Soma da multiplicação das colunas do CNPJ com o fator de multiplicacao #1
  WHILE @cont BEGIN
    SET @Resultado = @Resultado + convert(int, substring(@CNPJt, @cont, 1)) * convert(int, substring(@FatorMultiplicacao_fase1, @cont, 1))
    SET @cont = @cont + 1
  END

  -- Verifica o 'resto' da divisao por 11
  SET @Resultado = @Resultado%11

  -- Gera o digito verificador #1
  IF (@Resultado)
  BEGIN
    SET @DigitoVerificador1 = 0
  END
  ELSE
  BEGIN
    SET @DigitoVerificador1 = 11 - @Resultado
  END

  -- Fim da primeira fase:
  SET @CNPJt = @CNPJt + convert(varchar, @DigitoVerificador1)

  -- Reseta o contador
  SET @cont = 0
  SET @Resultado = 0

  -- Soma da multiplicação das colunas do CNPJ com o fator de multiplicacao #1
  WHILE @cont BEGIN
    SET @Resultado = @Resultado + convert(int, substring(@CNPJt, @cont, 1)) * convert(int, substring(@FatorMultiplicacao_fase2, @cont, 1))
    SET @cont = @cont + 1
  END

  -- Verifica o 'resto' da divisao por 11
  SET @Resultado = @Resultado%11

  -- Gera o digito verificador #2
  IF (@Resultado)
  BEGIN
    SET @DigitoVerificador2 = 0
  END
  ELSE
  BEGIN
    SET @DigitoVerificador2 = 11 - @Resultado
  END

  -- Fim da segunda fase:
  SET @CNPJt = @CNPJt + convert(varchar, @DigitoVerificador2)

  -- Verifica digitos verificadores gerados com os do enviados
  IF (substring(@CNPJ, 13, 1) @DigitoVerificador1) OR (substring(@CNPJ, 14, 1) @DigitoVerificador2)
  BEGIN
    RETURN '0'
  END

  RETURN @CNPJ
END
GO

Se preferir, clique aqui para clonar o gist.