SQL BÁSICO 2
__________________________________________________________________________________
CREATE FUNCTION [dbo].[rec_validar_nie](@NIE VARCHAR(20))
RETURNS BIT
AS
BEGIN
DECLARE @NIE_num varchar(20)
DECLARE @NIE_let_ini varchar(20)
DECLARE @NIE_let_final varchar(20)
DECLARE @letra_NIF varchar(1)
DECLARE @RESULT BIT
DECLARE @NIF_result AS VARCHAR(20)
--comprobar 9 dígitos
IF LEN(@NIE)=9 AND @NIE IS NOT NULL
BEGIN
SET @NIE_let_ini =LEFT(@NIE,1) -- extraer letra inicial
SET @NIE_let_final =RIGHT(@NIE,1) -- extraer letra final
SET @NIE_num=SUBSTRING(@NIE,2,7) -- extraer parte numérica
-- validar letra inicial, final y parte numérica
IF (SELECT ISNUMERIC (@NIE_let_ini))=0
AND (SELECT ISNUMERIC (@NIE_let_final))=0
AND (SELECT ISNUMERIC (@NIE_num))=1
BEGIN
--Se sustituye la letra inicial por x=0,y=1, z=2, y se trata como un NIF
IF (@NIE_let_ini='x') SET @NIE_let_ini=0
IF (@NIE_let_ini='y') SET @NIE_let_ini=1
IF (@NIE_let_ini='z') SET @NIE_let_ini=2
SET @NIF_result=@NIE_let_ini + @NIE_num + @NIE_let_final
--Ejecutamos el procedimiento para validar NIF, OBTIENE TRUE O FALSE
SET @RESULT= (SELECT dbo.rec_validar_nif(@NIF_result))
END
ELSE
BEGIN
SET @RESULT= 0
END
END
ELSE
BEGIN
SET @RESULT= 0
END
RETURN @RESULT
END
GO
__________________________________________________________________________________
CREATE FUNCTION [dbo].[rec_validar_nif](@NIF VARCHAR(20))
RETURNS BIT
AS
BEGIN
DECLARE @NIF_sin_letra varchar(20)
DECLARE @letra_NIF varchar(1)
DECLARE @RESULT BIT
--Comrpueba que son 9 dígitos
IF @NIF IS NOT NULL AND (SELECT LEN(@NIF))=9
BEGIN
--EXTRAEMOS LA LETRA DEL NIF
SET @letra_NIF=RIGHT(@NIF,1)
--NIF SIN LETRA
set @NIF_sin_letra= SUBSTRING ( @NIF ,1 , 8 )
--VALIDAMOS PRIMERO QUE TENGA LA FORMA CORRECTA EL NIF
--Comprueba que hay una parte númerica y la letra
IF (SELECT ISNUMERIC(@NIF_sin_letra)) = 1 AND (SELECT ISNUMERIC(@letra_NIF)) =0
BEGIN
--SE CALCULA LA LETRA CORRECTA
DECLARE @letras varchar(23)='TRWAGMYFPDXBNJZSQVHLCKE'
DECLARE @letra_calculada varchar(1)
SET @letra_calculada= Substring(@Letras, (@NIF_sin_letra % 23) + 1, 1)
--DEVUELVE 1 SI LA LETRA ES CORRECTA
IF @letra_calculada =@letra_NIF SET @RESULT= 1
ELSE SET @RESULT= 0
END
ELSE
SET @RESULT= 0
END
ELSE
BEGIN
SET @RESULT= 0
END
RETURN @RESULT
END
GO
__________________________________________________________________________________
CREATE FUNCTION [dbo].[rec_ValidarIBAN]
( @vcharIban AS VARCHAR(34) )
RETURNS BIT
AS
BEGIN
DECLARE @vcharIbanAux AS VARCHAR (40)
DECLARE @i AS SMALLINT
DECLARE @vcharIbanTransformado AS VARCHAR(400)
DECLARE @LEN AS INT
DECLARE @modulo AS INT
DECLARE @bprimera AS INT
DECLARE @MENOS AS INT
DECLARE @Caracteres AS VARCHAR (70)
SET @Caracteres = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'
IF LEN(@vcharIBAN) < 15 --16
BEGIN
RETURN 0
END
IF ISNUMERIC (SUBSTRING(@vcharIban,1,2)) = 1
BEGIN
RETURN 0
END
IF PATINDEX('%[^' + @Caracteres + ']%', @vcharIban) > 0
BEGIN
RETURN 0
END
SET @vcharIbanaux = SUBSTRING(@vcharIban, 5, LEN(RTRIM(@vcharIban)) - 4) + + SUBSTRING(@vcharIban, 1,4)
SET @vcharIbanaux = REPLACE(@vcharIbanaux, 'A', '10')
SET @vcharIbanaux = REPLACE(@vcharIbanaux, 'B', '11')
SET @vcharIbanaux = REPLACE(@vcharIbanaux, 'C', '12')
SET @vcharIbanaux = REPLACE(@vcharIbanaux, 'D', '13')
SET @vcharIbanaux = REPLACE(@vcharIbanaux, 'E', '14')
SET @vcharIbanaux = REPLACE(@vcharIbanaux, 'F', '15')
SET @vcharIbanaux = REPLACE(@vcharIbanaux, 'G', '16')
SET @vcharIbanaux = REPLACE(@vcharIbanaux, 'H', '17')
SET @vcharIbanaux = REPLACE(@vcharIbanaux, 'I', '18')
SET @vcharIbanaux = REPLACE(@vcharIbanaux, 'J', '19')
SET @vcharIbanaux = REPLACE(@vcharIbanaux, 'K', '20')
SET @vcharIbanaux = REPLACE(@vcharIbanaux, 'L', '21')
SET @vcharIbanaux = REPLACE(@vcharIbanaux, 'M', '22')
SET @vcharIbanaux = REPLACE(@vcharIbanaux, 'N', '23')
SET @vcharIbanaux = REPLACE(@vcharIbanaux, 'O', '24')
SET @vcharIbanaux = REPLACE(@vcharIbanaux, 'P', '25')
SET @vcharIbanaux = REPLACE(@vcharIbanaux, 'Q', '26')
SET @vcharIbanaux = REPLACE(@vcharIbanaux, 'R', '27')
SET @vcharIbanaux = REPLACE(@vcharIbanaux, 'S', '28')
SET @vcharIbanaux = REPLACE(@vcharIbanaux, 'T', '29')
SET @vcharIbanaux = REPLACE(@vcharIbanaux, 'U', '30')
SET @vcharIbanaux = REPLACE(@vcharIbanaux, 'V', '31')
SET @vcharIbanaux = REPLACE(@vcharIbanaux, 'W', '32')
SET @vcharIbanaux = REPLACE(@vcharIbanaux, 'X', '33')
SET @vcharIbanaux = REPLACE(@vcharIbanaux, 'Y', '34')
SET @vcharIbanaux = REPLACE(@vcharIbanaux, 'Z', '35')
SET @vcharIbanTransformado = @vcharIbanAux
SET @len = 0
BEGIN
SET @bprimera = 0
WHILE LEN(@vcharIbanTransformado) > 0
BEGIN
IF @bprimera = 0
BEGIN
SET @modulo = (SELECT CAST(CAST(SUBSTRING(@vcharIbanTransformado, 1, 9) AS BIGINT ) % 97 as VARCHAR(20) ))
SET @LEN = (SELECT LEN(RTRIM(CAST(@modulo AS VARCHAR(20)))))
SET @MENOS = LEN((SELECT SUBSTRING(@vcharIbanTransformado, 10, (9 - @LEN )) ))
SET @vcharIbanAux = CAST(@modulo AS VARCHAR(20)) + (SELECT SUBSTRING(@vcharIbanTransformado, 10, (9 - @LEN )) )
SET @bprimera = 1
SET @vcharIbanTransformado = SUBSTRING(@vcharIbanTransformado, 10, len(@vcharIbanTransformado) -9)
END
ELSE
BEGIN
SET @modulo = (SELECT CAST(@vcharIbanAux AS BIGINT ) % 97 )
SET @MENOS = LEN((SELECT SUBSTRING(@vcharIbanTransformado, 1, (9 - @LEN )) ))
SET @vcharIbanAux = CAST(@modulo AS VARCHAR(20)) + (SELECT SUBSTRING(@vcharIbanTransformado, @MENOS + 1, (9 - @LEN )) )
IF LEN (@vcharIbanTransformado) >= @MENOS
BEGIN
SET @vcharIbanTransformado = SUBSTRING(@vcharIbanTransformado, @MENOS + 1, len(@vcharIbanTransformado) - @MENOS + 1)
END
ELSE
BEGIN
SET @vcharIbanTransformado = SUBSTRING(@vcharIbanTransformado, @MENOS + 1, LEN (@vcharIbanTransformado) - @MENOS + 1)
END
IF LEN(@vcharIbanTransformado) - @MENOS < = 0
BEGIN
IF (SELECT CAST(@vcharIbanaux AS BIGINT ) % 97 ) = 1
BEGIN
RETURN 1
END
END
END
END
END
RETURN 0
END
GO
__________________________________________________________________________________
CREATE FUNCTION [dbo].[rec_ValidarBIC] (@strBIC AS VARCHAR(11))
RETURNS BIGINT
AS
BEGIN
DECLARE @I AS INT
DECLARE @X AS BIGINT
SET @X = 1
SET @I = 1
WHILE @I < 7
BEGIN
IF NOT ASCII(SUBSTRING(@strBIC,@I,1)) BETWEEN 65 AND 90
BEGIN
SET @X = 0
END
SET @I = @I + 1
END
IF NOT ASCII(SUBSTRING(@strBIC,7,1)) BETWEEN 65 AND 90 AND not ASCII(SUBSTRING(@strBIC,7,1)) BETWEEN 50 AND 57
BEGIN
SET @X = 0
END
IF NOT ASCII(SUBSTRING(@strBIC,8,1)) BETWEEN 65 AND 78 AND
NOT ASCII(SUBSTRING(@strBIC,8,1)) BETWEEN 80 AND 90 AND
NOT ASCII(SUBSTRING(@strBIC,8,1)) BETWEEN 48 AND 57
BEGIN
SET @X = 0
END
IF (SELECT COUNT(*) FROM DBO.rec_paises WHERE iso2 = SUBSTRING(@strBIC,5,2)) = 0
BEGIN
SET @X = 0
END
IF LEN(@strBIC) <> 8 AND LEN(@strBIC) <> 11
BEGIN
SET @X = 0
END
IF LEN(@strBIC) = 11
BEGIN
SET @I = 9
WHILE @I < 12
BEGIN
IF not ASCII(SUBSTRING(@strBIC,@I,1)) BETWEEN 65 AND 90 AND NOT ASCII(SUBSTRING(@strBIC,@I,1)) between 48 and 57
BEGIN
SET @X = 0
END
SET @I = @I + 1
END
END
RETURN (@X)
END
GO
__________________________________________________________________________________
No hay comentarios :
Publicar un comentario