Mostrando entradas con la etiqueta función sql. Mostrar todas las entradas
Mostrando entradas con la etiqueta función sql. Mostrar todas las entradas

lunes, 4 de marzo de 2013

Validar dirección de email con t-sql

Una función bastante recurrente es tener que validar si una dirección de correo electrónico es válida o no.

He hecho una función de de t-sql que valida si un mail es válido o no. En caso de ser válido devuelve el correo electrónico en minúsculas y sin espacios al principio y al final; si no es válido devuelve una cadena vacía.

Esta función no contempla todos los casos pero se aproxima bastante al estándar, por ejemplo la dirección "dircon@y?"@dominio.com sería válido, pero esta función devolverá que no es correcto.

Código de la función:

CREATE FUNCTION [dbo].[fn_CompruebaEmail](@email VARCHAR(255))   

RETURNS VARCHAR(255)  
as  
BEGIN  
     Declare @valid bit  
     Declare @domain as nvarchar(256)
     Declare @str1 Varchar(128)
Declare @i int
 
     IF @email IS NOT NULL   
 SET @email = REPLACE(@email,CHAR(10),'')
 SET @email = REPLACE(@email,CHAR(13),'')
 SET @email = REPLACE(@email,';','')
          SET @email = LOWER(@email)
          Set @email = LTRIM(RTRIM(@email))
          While (CHARINDEX('  ',@email,0) <> 0)
Begin
Set @email = REPLACE(@email,'  ','')
Continue
 End  
 Set @email = LTRIM(RTRIM(@email))
          SET @valid = 0  
          --IF @email like '[a-z,0-9,_,-]%@[a-z,0-9,_,-]%.[a-z][a-z]%'  
          If  Patindex('[a-z,0-9,_,-]%@[a-z,0-9,-]%.[a-z][a-z]%', @email)=1  
AND @email Not Like '%@%\_%'  ESCAPE '\'
             AND @email NOT like '%@%@%'  
             AND CHARINDEX('.@',@email) = 0  
             AND CHARINDEX('..',@email) = 0  
             AND CHARINDEX(',',@email) = 0  
             AND RIGHT(@email,1) between 'a' AND 'z'  
             And Patindex ('%[ &'',":;!+=\/()<>]%', @email) = 0
               SET @valid=1  
     If @email like '%._'
Set @valid = 0
     If @valid = 0
     Begin
Set @email = ''
     End
     
     --Se comprueba el dominio.
     
     If @email <> ''
     Begin
Set @str1 = ''
Set @i = 48
While @i <= 57
Begin
Set @str1 = @str1 + '|' + Char(@i)
Set @i = @i + 1
End

Set @i = 97
While @i <= 122
Begin
Set @str1 = @str1 + '|' + Char(@i)
Set @i = @i + 1
End    
   
Set @str1 = @str1 + '|.'
Set @str1 = @str1 + '|-'
    
Set @domain = RIGHT(@email,LEN(@email)-CHARINDEX('@',@email))
 
If @domain Like '%[^' + @str1 + ']%' escape '|'
Begin
Set @email = '' 
End
 
End
     
     Return @email
END

Búsqueda de caracteres no alfanuméricos en Sql

El otro día tuve que hacer una función en T-Sql que me permitiera comprobar si una dirección de correo electrónico era válida o no. Dentro de esta comprobación tuve que llegar a comprobar que el dominio no tuviera ningún carácter que no fuese letra, número, punto o guión. Después de mucho pensar como hacerlo y preguntarle a google y a https://duckduckgo.com/, encontré la manera de hacerlo con Like y el carácter comodín ^.

El código para detectar si una cadena tiene algún carácter diferente de los válidos, es decir, números, letras, punto y guión, es el siguiente:

Declare @texto as nvarchar(256)
Declare @str Varchar(128)
Declare @i int
Declare @valido int

Set @valido = 1 Set @str1 = '' 
Set @i = 48 

--Añade al varchar todos los números (ascii del 48 al 57) 
--   separados por un | While @i <= 57 
  Begin 
   Set @str = @str + '|' + Char(@i) 
   Set @i = @i + 1 
  End 

Set @i = 97 

--Añade al varchar todas las letras en minúsculas 
-- (ascii del 97 al 122) separados por un |
While @i <= 122 
 Begin 
Set @str = @str + '|' + Char(@i) 
  Set @i = @i + 1 
End 


--Añade al varchar el punto y el guión
Set @str = @str + '|.'
Set @str = @str + '|-' 

--Si el texto tiene algún caracter diferente de los que 
--  están en el varchar, usando como carácter de 
--   escape el | se marca como "NO válido"
-- Para indicar que busque cualquier carácter que no
--   está en el varchar se usa ^ -> no esté 
--   y [] -> Rango de caracteres
If @texto Like '%[^' + @str + ']%' escape '|' 
  Begin 
    Set @valido = '0' 
  End


miércoles, 13 de febrero de 2013

PadLeft en Sql

Muy a menudo necesito utilizar una función similar a PadLeft en Sql, como esta función no está implementada en Sql Server, siempre tengo que buscar la "query" en internet.

Yo creo que la mejor opción es construir una función en Sql que pueda usar en cualquier momento.

Esta función Padleft lo que haría sería, rellenar con un carácter por la izquierda hasta completar el número de caracteres que le indiques por parámetro.

Aquí os dejo el código que he creado para construir esta función.
En este código, por optimización, distingo si la cadena original es numérica o alfanumérica.

ALTER FUNCTION PADLEFT
(
   @value as nvarchar(100),
   @charIzq as varchar(1),
   @intLenth as int
)
RETURNS nvarchar(100)
AS
BEGIN

   DECLARE @vchPadded as nvarchar(100)

   Set @vchPadded=@value

   If LEN(@value)< @intLenth
   Begin

      If ISNUMERIC(@value)=1
      Begin
         SELECT @vchPadded = 

           REPLACE(STR(@value, @intLenth), SPACE(1), @charIzq)
      End
      Else
      Begin
         Set @vchPadded=@value
         While (LEN(@vchPadded)<@intLenth)
         Begin
            Set @vchPadded=@charIzq + @vchPadded
         End

      End
   End

   RETURN @vchPadded

END 


Para usarla tendrías que escribir una consulta de este tipo:
  Select dbo.PADLEFT('63','0',5)
Su resultado sería: 00063