问题描述
这是我的代码:
CREATE FUNCTION [dbo].[fnAppEmailCheck]
(@email VARCHAR(255))
--Returns true if the string is a valid email address.
RETURNS bit
AS
BEGIN
DECLARE @valid bit
IF @email IS NOT NULL
SET @email = LOWER(@email)
SET @valid = 0
IF @email LIKE '[a-z,0-9,_,+,-]%@[a-z,-]%.[a-z][a-z]%'
AND LEN(@email) = LEN(dbo.fnAppStripNonEmail(@email))
AND @email NOT like '%@%@%'
AND CHARINDEX('.@',@email) = 0
AND PATINDEX('%[a-zA-Z]%',@email) <> 0
AND CHARINDEX('..',@email) = 0
AND CHARINDEX(',',@email) = 0
AND RIGHT(@email,1) between 'a' AND 'z'
SET @valid = 1
RETURN @valid
END
我的 fnAppStripNonEmail 函数:
CREATE FUNCTION [dbo].[fnAppStripNonEmail]
(@Temp VarChar(1000))
RETURNS VarChar(1000)
AS
BEGIN
DECLARE @KeepValues AS varchar(50)
SET @KeepValues = '%[^a-z,^0-9,@,.,-]%'
WHILE PATINDEX(@KeepValues,@Temp) > 0
SET @Temp = STUFF(@Temp,PATINDEX(@KeepValues,@Temp),1,'')
RETURN @Temp
END
在屏幕截图中,每种格式都可以按照我的要求正常工作,但它将 22@gmail.com 标记为 1。我希望我的电子邮件 ID 至少包含一个字母。
解决方法
CREATE FUNCTION dbo.CheckValidEmail(@EMAIL varchar(100))RETURNS bit as
BEGIN
DECLARE @bitEmailVal as Bit
DECLARE @EmailText varchar(200)
SET @EmailText=ltrim(rtrim(isnull(@EMAIL,'')))
SET @bitEmailVal = case when @EmailText = '' then 0
when @EmailText like '% %' then 0
when @EmailText like ('%["(),:;<>\]%') then 0
when substring(@EmailText,charindex('@',@EmailText),len(@EmailText)) like ('%[!#$%&*+/=?^`_{|]%') then 0
when (left(@EmailText,1) like ('[-_.+]') or right(@EmailText,1) like ('[-_.+]')) then 0
when (@EmailText like '%[%' or @EmailText like '%]%') then 0
when @EmailText LIKE '%@%@%' then 0
when @EmailText NOT LIKE '_%@_%._%' then 0
else 1
end
RETURN @bitEmailVal
END
GO