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