当前位置:  开发笔记 > 数据库 > 正文

TSQL电子邮件验证(没有正则表达式)

如何解决《TSQL电子邮件验证(没有正则表达式)》经验,为你挑选了2个好方法。

好的,有一百万个正则表达用于验证电子邮件地址,但是如何将一些基本的电子邮件验证集成到Sql Server 2005的TSQL查询中?

我不想使用CLR程序或功能.只是直接TSQL.

有人已经解决了这个问题吗?



1> Tomalak..:

非常基本的是:

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的字母匹配,也会匹配大多数电子邮件系统不会接受/使用的地址构造.

无论如何,在数据库级别执行此操作可能是错误的方法,因此如上所示的基本健全性检查可能是您可以获得的最佳性能,并且在应用程序中执行此操作将为您提供更大的灵活性.


+1巧妙使用_强制最小长度.
非常感谢你.我刚刚用过.我们遇到的一个错误电子邮件地址是something@q.com是有效的电子邮件.我认为表达式应该从'%_@_%_.__%'更改为'%_@%_.__%'

2> cabgef..:

这里有一个示例函数,它更详细,我不记得我从多年前那里得到这个,或者如果我修改它,否则我会包括正确的归属:

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  


嗨cabgef,这是你给出的最佳解决方案.你能告诉我"fnAppStripNonEmail"的作用吗?
我需要添加条件`AND CHARINDEX('',@ email)= 0`以检查电子邮件地址中间的空格.
推荐阅读
sx-March23
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有