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
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
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
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.
Para usarla tendrías que escribir una consulta de este tipo:
Su resultado sería: 00063
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
Suscribirse a:
Entradas (Atom)