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
lunes, 4 de marzo de 2013
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)
--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
Declare @str Varchar(128)
Declare @i intDeclare @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ónSet @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
Suscribirse a:
Comentarios (Atom)