2009-01-08 223 views
6

我有这种场景,我需要物理数据库中的数据完整性。例如,我有一个变量@email_address VARCHAR(200),我想检查@email_address的值是否为电子邮件格式。任何人有任何想法如何检查T-SQL格式?T-SQL:检查电子邮件格式

非常感谢!

+0

可能重复的[Sql脚本来查找无效的电子邮件地址](http://stackoverflow.com/questions/801166/sql-script-to-find-invalid-email-addresses) – Neolisk 2015-01-28 15:27:03

回答

17

我测试了以下查询,其中包含许多不同的错误和有效的电子邮件地址。它应该完成这项工作。

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 protected]',@email_address) = 0 AND CHARINDEX('..',@email_address) = 0) 
) 
    print 'valid email address' 
ELSE 
    print 'not valid' 

它会检查这些条件:

  • 嵌入空格
  • '@' 不能是电子邮件地址
  • 的第一个字符 ''不能是电子邮件地址的最后一个字符
  • 必须有'。'之后某处“@”
  • 的“@”符号被允许
  • 域名应该具有至少2个字符的扩展名结尾
  • 不能有模式,如“@”和“..”
+0

谢谢!我对你发布的条件没有一个想法。感谢你的回答! – jerbersoft 2009-01-09 00:12:57

+0

@splattne ...这个函数在mssql 2008上不起作用。它是在mssql 2012上工作的很好的函数,但在2008上不是这样。 – IBM 2016-05-03 18:36:34

1

如果您使用SQL 2005或2008,您可能需要考虑编写CLR存储过程并使用.NET正则表达式引擎like this。如果您使用的是SQL 2000或更早版本,则可以使用VBScript脚本引擎的正则表达式like ths。您也可以使用扩展存储过程like this

8

AFAIK没有好办法做到这一点。

电子邮件格式标准是如此复杂的解析器已知运行到数千行代码,但即使您使用的是一个更简单的表单,它会失败一些晦涩但有效的地址,这本身不T-SQL支持正则表达式(再次,我不是100%),让你有somethign像一个简单的回退:

LIKE '%[email protected]_%_.__%'

..或相似。

我的感觉通常是,你不应该在最后时刻这样做(尽管插入到数据库中),你应该在第一个机会和/或公共网关(控制器实际上使SQL插入请求),顺便说一句,你会有正则表达式的优势,甚至可能是一个库,它会为你“进行真正的”验证。

1

恐怕没有简单的方法在T-SQL中做到这一点。要验证RFC 2822所允许的各种电子邮件地址,您需要使用正则表达式。

更多信息here

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