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