Función Validar CIF_NIF_NIE
PAra NIE estranjeros creo que no funciona. hay comentado una consulta a tablas para saber la provincia del NIF y tipo de socidad
/****** Autor: Cándido Castrillo Fecha: 09/11/2022
--eliminacion dependencias RAV
SELECT * FROM dbo.FUN_Validar_NIF_CIF('13129187M') ******/
otro ejemplo de uso: el simbolo ~ es el NOT en sql server
select *,
~ (SELECT valido FROM dbo.FUN_Validar_NIF_CIF(Cif_Establecimiento)) as Erroneo ,
(SELECT mensaje FROM dbo.FUN_Validar_NIF_CIF(Cif_Establecimiento)) AS Causa
from Gastos_Proveedores
/****** Autor: Cándido Castrillo Fecha: 10/11/2022
SELECT * FROM dbo.FUN_Validar_NIF_CIF('A58818501')
Otros CIF: X1234567L, B14507610, A4001772E, A4001091J,A4001076A, A4001065D, A0021002A, K4601037G******/
/**** SELECT Proveedor, CIFPro, (SELECT Valido FROM dbo.FUN_Validar_NIF_CIF(CIFPro)) AS Valido FROM Proveedor ****/
/*Función que devuelve 1 si es válido el NIF y 0 en caso contrario*/
CREATE FUNCTION dbo.FUN_Validar_NIF_CIF(@NIF nvarchar(50))
RETURNS @Resultado TABLE (Valido bit, Mensaje nvarchar(100))
BEGIN
DECLARE @Valido bit = 1
DECLARE @Mensaje nvarchar(100) = 'NIF validado correctamente'
DECLARE @Numero nvarchar(8)
DECLARE @Letra char
DECLARE @Resto int
DECLARE @LetraTabla char
DECLARE @Tipo_Organizacion char(1)
DECLARE @Codigo_Provincia char(2)
DECLARE @Digitos_Centrales char(7)
DECLARE @Digito_Control char(2)
DECLARE @Letra_Tipo_Organizacion char(1)
DECLARE @Numero_Codigo_Provincia char(2)
DECLARE @i int = 1
DECLARE @Pares int = 0, @ImparX2 int = 0, @ImparSuma int = 0, @ImparesSuma int = 0,
@SumaTotal int = 0, @Unidad int = 0
DECLARE @Posicion char
/********Comprobamos si el primer caracter es letra (CIF) o número (NIF) ********/
SET @Posicion = SUBSTRING(@NIF, 1, 1)
IF ISNUMERIC(@Posicion) = 1 OR @Posicion = 'X' OR @Posicion = 'Y' OR @Posicion = 'Z'
BEGIN
/********Comprobamos si la longitud del NIF es de 9 caracteres********/
IF LEN(@NIF) != 9
BEGIN
SET @Valido = 0
SET @Mensaje = 'La longitud del NIF debe ser de 9 caracteres'
INSERT INTO @Resultado VALUES (@Valido, @Mensaje)
RETURN
END
/********Comprobamos si el primer caracter es X, Y, Z que se sustituyen por 0, 1, 2********/
SET @Numero = SUBSTRING(@NIF, 1, 1)
IF ISNUMERIC(@Numero) != 1
BEGIN
IF (@Numero = 'X' OR @Numero = 'Y' OR @Numero = 'Z')
SET @NIF = CAST((ASCII(@Numero) - 88) AS char) + SUBSTRING(@NIF, 2, 9)
END
/********Comprobamos si los 8 dígitos son numéricos********/
SET @Numero = SUBSTRING(@NIF, 1, 8)
IF ISNUMERIC(@Numero) != 1
BEGIN
SET @Valido = 0
SET @Mensaje = 'El NIF debe estar compuesto de 8 dígitos y 1 letra'
INSERT INTO @Resultado VALUES (@Valido, @Mensaje)
RETURN
END
SET @Letra = SUBSTRING(@NIF, 9, 1)
SET @Resto = @Numero % 23
declare @Letras nvarchar(50)
set @Letras = 'TRWAGMYFPDXBNJZSQVHLCKE'
-- select SUBSTRING(@Letras,1,1)
set @LetraTabla = SUBSTRING(@Letras,@Resto+1,1)
/*
SELECT @LetraTabla = Letra
FROM dbo.NIF_Letras
WHERE Indice = @Resto
*/
IF (@Letra != @LetraTabla)
BEGIN
SET @Valido = 0
SET @Mensaje = 'La letra del NIF no es correcta'
END
END
ELSE
BEGIN
/********Comprobamos si la longitud del CIF es de 9 caracteres********/
IF LEN(@NIF) != 9
BEGIN
SET @Valido = 0
SET @Mensaje = 'La longitud del CIF debe ser de 9 caracteres'
INSERT INTO @Resultado VALUES (@Valido, @Mensaje)
RETURN
END
/********Comprobamos si los 7 dígitos centrales son numéricos********/
SET @Digitos_Centrales = SUBSTRING(@NIF, 2, 7)
IF ISNUMERIC(@Digitos_Centrales) != 1
BEGIN
SET @Valido = 0
SET @Mensaje = 'El CIF debe estar compuesto por 7 dígitos centrales'
INSERT INTO @Resultado VALUES (@Valido, @Mensaje)
RETURN
END
/********Comprobamos si el Tipo_Organizacion existe en la tabla********/
/*
SET @Tipo_Organizacion = SUBSTRING(@NIF, 1, 1)
SELECT @Letra_Tipo_Organizacion = Letra
FROM dbo.CIF_Tipo_Organizacion
WHERE Letra = @Tipo_Organizacion
IF @Letra_Tipo_Organizacion IS NULL
BEGIN
SET @Valido = 0
SET @Mensaje = 'La letra del CIF no es correcta'
INSERT INTO @Resultado VALUES (@Valido, @Mensaje)
RETURN
END
/*******Comprobamos si el Codigo_Provincia existe en la tabla********/
SET @Codigo_Provincia = SUBSTRING(@NIF, 2, 2)
/************ CIF asignados a empresas Americanas **************/
IF (@Codigo_Provincia != '00')
BEGIN
SELECT @Numero_Codigo_Provincia = Codigo
FROM dbo.CIF_Codigo_Provincia
WHERE Codigo = @Codigo_Provincia
IF @Numero_Codigo_Provincia IS NULL
BEGIN
SET @Valido = 0
SET @Mensaje = 'Los dígitos de la posición 2 y 3 no coinciden con ninguna Provincia'
INSERT INTO @Resultado
VALUES (@Valido, @Mensaje)
RETURN
END
END
*/
/*******Aplicamos el algoritmo de validación********/
WHILE (@i <= 7)
BEGIN
IF (@i % 2 = 0)
/*Sumar los dígitos de las posiciones pares de @DigitosCentrales*/
SET @Pares += CAST(SUBSTRING(@Digitos_Centrales, @i, 1) AS int)
ELSE
BEGIN
/*Multiplicar por 2 las posiciones impares de @DigitosCentrales y
sumar los dígitos*/
SET @ImparX2 = CAST(SUBSTRING(@Digitos_Centrales, @i, 1) AS int) * 2
SET @ImparSuma = (@ImparX2 / 10) + (@ImparX2 % 10)
/*Acumular los impares*/
SET @ImparesSuma += @ImparSuma
END
SET @i += 1
END
/*Sumar los Pares e Impares*/
SET @SumaTotal = @Pares + @ImparesSuma
/*Cogemos la unidad de @SumaTotal y le restamos 10*/
SET @Unidad = 10 - (@SumaTotal % 10)
IF @Unidad = 10
SET @Unidad = 0
/*******Comprobamos si el dígito de control es número o letra *******/
SET @Digito_Control = SUBSTRING(@NIF, 9, 1)
IF ISNUMERIC(@Digito_Control) != 1
BEGIN
SET @Digito_Control = ASCII(@Digito_Control) - 64
IF @Digito_Control = 10
SET @Digito_Control = 0
END
IF (@Unidad != @Digito_Control)
BEGIN
SET @Valido = 0
SET @Mensaje = 'El Dígito de Control no es correcto'
END
END
INSERT INTO @Resultado
VALUES (@Valido, @Mensaje)
RETURN
END
GO