2010-02-09 54 views
5

使用Microsoft SQL Server 2005及更高版本,我使用什么代码来验证电子邮件地址是否正确?
是否有电子邮件数据类型?
是否存在电子邮件检查约束?
是否有电子邮件规则?
是否有电子邮件触发器?
是否有电子邮件验证存储过程?Microsoft SQL Server电子邮件验证

回答

6

我通常不推荐使用CLR存储过程,但这是一个很好的使用。 SQL的字符串处理功能并不好,但在CLR存储过程中使用.NET Regex很简单,您可以使用许多现有正则表达式模式之一来满足您的需求(例如these之一)。见Regular Expressions Make Pattern Matching And Data Extraction Easier

做不到这一点(有些DBA的是非常严格的启用CLR功能),或许这可能会感兴趣:

Working with email addresses in SQL Server

更新:响应在评论中质疑:一个CLR stored procedure是SQL Server实例中的数据库对象,它在Microsoft .NET Framework公共语言运行库(CLR)(如Visual Basic或C#)中创建的程序集中编程。

在创建SQL 服务器CLR存储过程包括以下步骤:

  • 定义在由.NET Framework支持的语言 存储过程作为一类的静态方法。对于 有关如何编程 CLR存储过程的更多信息,请参阅CLR存储过程 过程。然后,编译该类到 通过使用适当的 语言编译器在.NET 框架中构建程序集。

  • 通过使用CREATE ASSEMBLY 语句在SQL Server中注册程序集。有关 如何使用SQL 服务器中的程序集的更多信息,请参阅程序集。

  • 使用CREATE PROCEDURE语句创建引用注册程序集 的存储过程。 Ref

Writing CLR Stored Procedures in C# - Introduction to C# (Part 1)

+0

什么是CLR存储过程?这与存储过程相同吗?首字母缩略词CLR让我感到困惑。 – 2010-02-09 15:44:38

+1

CLR是通用语言运行时 - 存储过程CLR(或功能等)允许你写在C#中的程序,而是直接从T-SQL调用它。 – onupdatecascade 2010-02-10 21:42:30

1

可以使用正则表达式类编写托管SP。根据RFC的电子邮件验证是很复杂的事情。 我们只需查询AD是否存在用户。

+0

如果这些外部用户不在AD中,该怎么办? – 2010-02-09 14:53:01

+0

我同意。最初的问题是如何验证电子邮件地址,而不是验证用户是否在Active Directory中。 – 2010-02-09 15:43:56

+0

@米奇是确保它工作在我们_special_情况下 – 2010-02-09 17:17:34

1

SQL Server中没有内置的机制来验证电子邮件地址。

有许多正则表达式可以验证一个电子邮件地址(有些比其他的长得多),例如here,具体参见“官方标准:RFC2822”,例如,

现在,SQL Server没有内置支持运行正则表达式,所以如果你真的想给SQL内做到这一点,你需要使用CLR功能 - 即编写执行验证一个.NET函数,然后可以从SQL调用。

不过,我会验证电子邮件地址早些时候,它涉及到数据库之前。

+0

ONY我希望把尽量靠近数据库级别尽可能验证。不在数据库级别实施的规则只是一个建议。 – 2010-02-09 15:45:40

+0

我听到你在说什么,我不是说我不同意完全......但是,它至少应该* *也可以做得比较早(即越早,你可以验证输入,赶上不好的数据,越快用户可以通知==更好的用户体验)。这是一个经典的例子,你可以使用SQL CLR(公共语言运行时)在数据库级别实现这一点(SQL Server中运行的.NET代码) – AdaTheDev 2010-02-09 16:17:49

1

如果OLE自动化启用,您可以轻松创建一个UDF来处理正则表达式,然后只需调用:

CASE WHEN dbo.RegExFind 
    (
    '[email protected]', 
    '^[a-z0-9][a-z0-9._-]*@[a-z0-9][a-z0-9.-]*[a-z0-9]\.[a-z][a-z]+$', 
    1 -- Case-insensitive or not 
    ) = 1 THEN 'OK' ELSE 'Not OK' END 

我不记得在那里我得到了我的RegExFind() UDF的代码,但它看起来像代码已经出现在StackOverflow,here