TSQL电子邮件validation(无正则expression式)
好的,有100万个正则expression式用于validation电子邮件地址,但是如何将一些基本的电子邮件validation集成到SQL Server 2005的TSQL查询中?
我不想使用CLR过程或函数。 只需直接TSQL。
有人已经解决了这个问题吗?
非常基本的是:
SELECT EmailAddress, CASE WHEN EmailAddress LIKE '%_@_%_.__%' AND EmailAddress NOT LIKE '%[any obviously invalid characters]%' THEN 'Could be' ELSE 'Nope' END Validates FROM Table
这匹配所有与@中间的所有内容,前面至less有一个字符,后面至less有两个点,至less两个TLD。
你可以编写更多的LIKE
模式来做更具体的事情,但是你将永远无法匹配所有可能成为电子邮件地址的东西,而不会让任何事情不能通过。 即使有正则expression式,你也很难做正确的事情。 此外,甚至根据RFC的字母进行匹配也会匹配大多数电子邮件系统不会接受/使用的地址结构。
在数据库级别做这个事情可能是错误的,所以上面提到的基本的完整性检查可能是最好的,你可以在性能方面得到最好的结果,而在应用程序中这样做会为你提供更大的灵活性。
下面是一个示例函数,这个函数更详细一些,我不记得从几年前得到的信息,或者我修改了它,否则我会包含正确的属性:
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 '[az,0-9,_,-]%@[az,0-9,_,-]%.[az][az]%' AND LEN(@email) = LEN(dbo.fnAppStripNonEmail(@email)) AND @email NOT like '%@%@%' AND CHARINDEX('.@',@email) = 0 AND CHARINDEX('..',@email) = 0 AND CHARINDEX(',',@email) = 0 AND RIGHT(@email,1) between 'a' AND 'z' SET @valid=1 RETURN @valid END
很好的答案! 基于这些build议,我想出了一个简化的function,结合了最好的2个答案。
CREATE FUNCTION [dbo].[fnIsValidEmail] ( @email varchar(255) ) --Returns true if the string is a valid email address. RETURNS bit As BEGIN RETURN CASE WHEN ISNULL(@email, '') <> '' AND @email LIKE '%_@%_.__%' THEN 1 ELSE 0 END END
Create Function [dbo].[fnAppStripNonEmail](@Temp VarChar(1000)) Returns VarChar(1000) AS Begin Declare @KeepValues as varchar(50) Set @KeepValues = '%[^az,0-9,@,.,-]%' While PatIndex(@KeepValues, @Temp) > 0 Set @Temp = Stuff(@Temp, PatIndex(@KeepValues, @Temp), 1, '') Return @Temp End
这是select它们的最简单的方法。
使用这个查询
SELECT * FROM <TableName> WHERE [EMail] NOT LIKE '%_@__%.__%'
FnAppStripNonEmail在分数下丢失,需要将其添加到保留值
Create Function [dbo].[fnAppStripNonEmail](@Temp VarChar(1000)) Returns VarChar(1000) AS Begin Declare @KeepValues as varchar(50) Set @KeepValues = '%[^az,0-9,_,@,.,-]%' While PatIndex(@KeepValues, @Temp) > 0 Set @Temp = Stuff(@Temp, PatIndex(@KeepValues, @Temp), 1, '') Return @Temp End
CREATE FUNCTION fnIsValidEmail ( @email varchar(255) ) RETURNS bit AS BEGIN DECLARE @IsValidEmail bit = 0 IF (@email not like '%[^az,0-9,@,.,!,#,$,%%,&,'',*,+,--,/,=,?,^,_,`,{,|,},~]%' --First Carat ^ means Not these characters in the LIKE clause. The list is the valid email characters. AND @email like '%_@_%_.[az,0-9][az]%' AND @email NOT like '%@%@%' AND @email NOT like '%..%' AND @email NOT like '.%' AND @email NOT like '%.' AND CHARINDEX('@', @email) <= 65 ) BEGIN SET @IsValidEmail = 1 END RETURN @IsValidEmail END
从Tomalak的调皮
select 1 where @email not like '%[^az,0-9,@,.]%' and @email like '%_@_%_.__%'