好的,有一百万个正则表达用于验证电子邮件地址,但是如何将一些基本的电子邮件验证集成到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
这与所有内容中的@匹配,前面至少有一个字符,后跟至少两个,一个点,至少两个用于TLD.
您可以编写更多LIKE
可以执行更具体操作的模式,但是您永远无法匹配可能成为电子邮件地址的所有内容,同时又不会泄漏任何不可用的内容.即使使用正则表达式,您也很难做到正确.此外,即使根据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 '[a-z,0-9,_,-]%@[a-z,0-9,_,-]%.[a-z][a-z]%' 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