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 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
Suscribirse a:
Entradas (Atom)