T-SQL:检查电子邮件格式

8
我有一个需要在物理数据库中保证数据完整性的场景。例如,我有一个变量@email_address VARCHAR(200),我想检查@email_address的值是否符合电子邮件格式。有人知道如何在T-SQL中检查格式吗?
非常感谢!

可能是重复的问题:Sql脚本查找无效的电子邮件地址 - Victor Zakharov
4个回答

18

我使用许多不正确和有效的电子邮件地址测试了以下查询。它应该能够完成工作。

IF (
     CHARINDEX(' ',LTRIM(RTRIM(@email_address))) = 0 
AND  LEFT(LTRIM(@email_address),1) <> '@' 
AND  RIGHT(RTRIM(@email_address),1) <> '.' 
AND  CHARINDEX('.',@email_address ,CHARINDEX('@',@email_address)) - CHARINDEX('@',@email_address ) > 1 
AND  LEN(LTRIM(RTRIM(@email_address ))) - LEN(REPLACE(LTRIM(RTRIM(@email_address)),'@','')) = 1 
AND  CHARINDEX('.',REVERSE(LTRIM(RTRIM(@email_address)))) >= 3 
AND  (CHARINDEX('.@',@email_address ) = 0 AND CHARINDEX('..',@email_address ) = 0)
)
   print 'valid email address'
ELSE
   print 'not valid'

它检查以下条件:

  • 没有嵌入空格
  • '@'不能是电子邮件地址的第一个字符
  • '.'不能是电子邮件地址的最后一个字符
  • '@'之后必须有'.'
  • 允许使用'@'符号
  • 域名应以至少2个字符扩展名结尾
  • 不能有像'.@'和'..'这样的模式

谢谢!我之前对你发布的条件一无所知。感谢你的回答! - jerbersoft
@splattne 这个函数在 MSSQL 2008 上不起作用。它是在 MSSQL 2012 上运行良好的优秀函数,但在 2008 上却不行。 - IBM

8
据我所知,目前没有一个好的方法来实现这个功能。
电子邮件格式标准非常复杂,解析器已知需要数千行代码才能完成。即使你使用更简单的形式,也会导致一些模糊但有效的地址失败。此外,由于T-SQL不支持正则表达式(我不是100%确定),因此你必须在没有正则表达式的情况下进行操作,只能使用类似以下的简单回退方案: LIKE '%_@_%_.__%' 我的感觉通常是,你不应该在最后一刻(插入到数据库时)才进行此操作,而应该在第一时间和/或一个公共网关(实际上发出SQL插入请求的控制器)进行操作。在那里,你将拥有正则表达式的优势,甚至可能会有一个为你执行“真正”验证的库。

对于基本验证来说,这就足够了。 - Jānis Gruzis

1
如果您使用的是SQL 2005或2008,您可能想要尝试编写CLR存储过程并使用.NET正则表达式引擎(类似于这样)。如果您使用的是SQL 2000或更早版本,则可以使用VBScript脚本引擎的正则表达式(类似于这个)。您还可以使用扩展存储过程(类似于这个)

1

很遗憾,在T-SQL中没有简单的方法来完成这个任务。要验证RFC 2822允许的所有电子邮件地址的各种形式,您需要使用正则表达式。

更多信息在此处

如果您想简化它,您需要定义您的范围。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接