1) Validação onde o CPF/CNPJ apresenta máscara, ou seja, CPF: xxx.xxx.xxx-xx ou CNPJ: xx.xxx.xxx/xxxx-xx
CREATE FUNCTION [dbo].[UDF_ValidaCpfCnpj] (@TEXTO VARCHAR(20))Para utilizar basta usar um script SQL no tipo:
RETURNS BIT
AS
BEGIN
DECLARE @CPF_CNPJ VARCHAR(20) = ''
;WITH SPLIT AS
(
SELECT 1 AS ID, SUBSTRING(@TEXTO, 1, 1) AS LETRA
UNION ALL
SELECT ID + 1, SUBSTRING(@TEXTO, ID + 1, 1)
FROM SPLIT
WHERE ID < LEN(@TEXTO)
)
SELECT @CPF_CNPJ += LETRA
FROM SPLIT
WHERE LETRA LIKE '[0-9]'
OPTION(MAXRECURSION 0)
IF LEN(@CPF_CNPJ) NOT IN (11, 14)
BEGIN
RETURN 0
END
DECLARE
@I INT,
@J INT = 1,
@N INT = LEN(@CPF_CNPJ),
@DIGITO1 INT = SUBSTRING(@CPF_CNPJ, LEN(@CPF_CNPJ) - 1, 1),
@DIGITO2 INT = SUBSTRING(@CPF_CNPJ, LEN(@CPF_CNPJ), 1),
@TOTAL_TMP INT,
@COEFICIENTE_TMP INT,
@DIGITO_TMP INT,
@VALOR_TMP INT,
@VALOR1 INT,
@VALOR2 INT
WHILE @J <= 2
BEGIN
SELECT
@TOTAL_TMP = 0,
@COEFICIENTE_TMP = 2,
@I = @N + @J - 3
WHILE @I >= 0
BEGIN
SELECT
@DIGITO_TMP = SUBSTRING(@CPF_CNPJ, @I, 1),
@TOTAL_TMP += @DIGITO_TMP * @COEFICIENTE_TMP,
@COEFICIENTE_TMP = @COEFICIENTE_TMP + 1,
@I -= 1
IF @COEFICIENTE_TMP > 9 AND @N = 14
SET @COEFICIENTE_TMP = 2
END
SET @VALOR_TMP = 11 - (@TOTAL_TMP % 11)
IF (@VALOR_TMP >= 10)
SET @VALOR_TMP = 0
IF @J = 1
SET @VALOR1 = @VALOR_TMP
ELSE
SET @VALOR2 = @VALOR_TMP
SET @J += 1
END
RETURN
CASE WHEN @VALOR1 = @DIGITO1 AND @VALOR2 = @DIGITO2
THEN 1
ELSE 0
END
END
GO
SELECT CASE
WHEN [dbo].[UDF_ValidaCpfCnpj] ('XX.XXX.XXX/XXXX-XX') = 1
THEN 'Válido'
ELSE 'Inválido'
END
2) Validação onde o CPF/CNPJ NÃO apresenta máscara, ou seja, CPF: xxxxxxxxxxx ou CNPJ: xxxxxxxxxxxxxx
CREATE FUNCTION [dbo].[UDF_ValidaCpfCnpj] (@CPF_CNPJ VARCHAR(20))Para usar a função acima basta usar a seguinta consulta SQL:
RETURNS BIT
AS
BEGIN
DECLARE
@I INT,
@J INT = 1,
@N INT = LEN(@CPF_CNPJ),
@DIGITO1 INT = SUBSTRING(@CPF_CNPJ, LEN(@CPF_CNPJ) - 1, 1),
@DIGITO2 INT = SUBSTRING(@CPF_CNPJ, LEN(@CPF_CNPJ), 1),
@TOTAL_TMP INT,
@COEFICIENTE_TMP INT,
@DIGITO_TMP INT,
@VALOR_TMP INT,
@VALOR1 INT,
@VALOR2 INT
WHILE @J <= 2
BEGIN
SELECT
@TOTAL_TMP = 0,
@COEFICIENTE_TMP = 2,
@I = @N + @J - 3
WHILE @I >= 0
BEGIN
SELECT
@DIGITO_TMP = SUBSTRING(@CPF_CNPJ, @I, 1),
@TOTAL_TMP += @DIGITO_TMP * @COEFICIENTE_TMP,
@COEFICIENTE_TMP = @COEFICIENTE_TMP + 1,
@I -= 1
IF @COEFICIENTE_TMP > 9 AND @N = 14
SET @COEFICIENTE_TMP = 2
END
SET @VALOR_TMP = 11 - (@TOTAL_TMP % 11)
IF (@VALOR_TMP >= 10)
SET @VALOR_TMP = 0
IF @J = 1
SET @VALOR1 = @VALOR_TMP
ELSE
SET @VALOR2 = @VALOR_TMP
SET @J += 1
END
RETURN
CASE WHEN @VALOR1 = @DIGITO1 AND @VALOR2 = @DIGITO2
THEN 1
ELSE 0
END
END
SELECT CASEEspero tem ajudado.
WHEN [dbo].[UDF_ValidaCpfCnpj] ('XX.XXX.XXX/XXXX-XX') = 1
THEN 'Válido'
ELSE 'Inválido'
END
Gostou? Comenta e compartilhe.
Fonte: SQL From Hell.com
0 Comentários