SQL Server - Función Validar CIF_NIF_NIE

 
Vista:

Función Validar CIF_NIF_NIE

Publicado por toti (8 intervenciones) el 12/11/2014 12:10:51
Buenos días,

alguien tiene una función en sql server para validar los NIF, CIF, NIE ?

Gracias

Saludos

Toti
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de Isaias Islas
Val: 3.250
Oro
Ha mantenido su posición en SQL Server (en relación al último mes)
Gráfica de SQL Server

Función Validar CIF_NIF_NIE

Publicado por Isaias Islas (4558 intervenciones) el 12/11/2014 18:09:39
Toti

Esta es un blog INTERNACIONAL, por lo que a muchos no les quedara claro que es un CIF, NIF o NIE, expliquemos eso:

DNI
Documento Nacional de Identidad. Es lo que su nombre indica. Cada persona posee el suyo y es único e intransferible. Obligatorio desde los 14 años de edad.

NIF
Es el mismo número del DNI con una letra añadida (resultado de una operación matemática de las cifras que componen el DNI) y empezó como un número identificador de los ciudadanos para Hacienda.

En la práctica, el DNI actual es idéntico al NIF.

CIF
Lo mismo que el NIF, pero para personas jurídicas, o sea, empresas. Cada empresa tiene el suyo.

También el número del permiso de conducir es el mismo DNI (o NIF)

Ahora viene la duda, ¿Por qué lo quieres hacer a NIVEL BASE DE DATOS?, siendo que muchos desarrolladores en C#, .NET, se han quebrado el cerebro para desarrollar dichas funciones:

http://geeks.ms/blogs/jvelasco/archive/2011/01/03/c-validar-cif-nif-nie.aspx
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Función Validar CIF_NIF_NIE

Publicado por toti (8 intervenciones) el 13/11/2014 08:05:35
Buenos días,
antes de nada gracias Isaias por tu tiempo.

Lo tengo que hacer a nivel de base de datos porque son aplicaciones externas que consumen objetos de mi base de datos y que no pueden ser modificadas, por eso es necesario controlar distintos procesos que son ejecutados sobre mi base de datos.

Gracias otra vez.

Saludos
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Función Validar CIF_NIF_NIE

Publicado por netsistemas (8 intervenciones) el 11/11/2022 20:56:59
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
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar