Eri*_*ard 30 t-sql sql-server email-validation
好的,有一百万个正则表达用于验证电子邮件地址,但是如何将一些基本的电子邮件验证集成到Sql Server 2005的TSQL查询中?
我不想使用CLR程序或功能.只是直接TSQL.
有人已经解决了这个问题吗?
Tom*_*lak 52
非常基本的是:
SELECT
EmailAddress,
CASE WHEN EmailAddress LIKE '%_@_%_.__%'
AND EmailAddress NOT LIKE '%[any obviously invalid characters]%'
THEN 'Could be'
ELSE 'Nope'
END Validates
FROM
Table
Run Code Online (Sandbox Code Playgroud)
这与所有内容中的@匹配,前面至少有一个字符,后跟至少两个,一个点,至少两个用于TLD.
您可以编写更多LIKE可以执行更具体操作的模式,但是您永远无法匹配可能成为电子邮件地址的所有内容,同时又不会泄漏任何不可用的内容.即使使用正则表达式,您也很难做到正确.此外,即使根据RFC的字母匹配,也会匹配大多数电子邮件系统不会接受/使用的地址构造.
无论如何,在数据库级别执行此操作可能是错误的方法,因此如上所示的基本健全性检查可能是您可以获得的最佳性能,并且在应用程序中执行此操作将为您提供更大的灵活性.
cab*_*gef 19
这里有一个示例函数,它更详细,我不记得我从多年前那里得到这个,或者如果我修改它,否则我会包括正确的归属:
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
Run Code Online (Sandbox Code Playgroud)