【问题标题】:Microsoft SQL Server email validationMicrosoft SQL Server 电子邮件验证
【发布时间】:2011-01-14 20:23:48
【问题描述】:

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

【问题讨论】:

    标签: sql-server sql-server-2005


    【解决方案1】:

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

    如果做不到这一点(一些 DBA 对启用 CLR 功能非常严格),也许这可能会引起人们的兴趣:

    Working with email addresses in SQL Server

    更新:回答 cmets 中的问题:CLR stored procedure 是 SQL Server 实例内的数据库对象,该对象在 Microsoft .NET Framework 公共语言运行时( CLR),例如 Visual Basic 或 C#。

    在 SQL 中创建 CLR 存储过程 服务器涉及以下步骤:

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

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

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

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

    【讨论】:

    • 什么是 CLR 存储过程?这和存储过程一样吗?首字母缩写词 CLR 让我很困惑。
    • CLR 是公共语言运行时——CLR 存储过程(或函数等)允许您在 C# 中编写过程,但直接从 T-SQL 调用它。
    【解决方案2】:

    您可以使用 Regex 类编写托管 SP。根据 RFC 进行电子邮件验证是一件复杂的事情。 我们只需查询 AD 是否存在用户。

    【讨论】:

    • 如果这些外部用户不在 AD 中怎么办?
    • 我同意。最初的问题是如何验证电子邮件地址,而不是验证用户是否在 Active Directory 中。
    【解决方案3】:

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

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

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

    但是,我会在电子邮件地址进入数据库之前提前验证它。

    【讨论】:

    • 我想让验证尽可能接近数据库级别。未在数据库级别强制执行的规则只是一个建议。
    • 我听到你在说什么,我并不是说我完全不同意......但是,至少应该早点完成(即你越早可以验证输入并捕获不良数据,越早通知用户 == 更好的用户体验)。这是一个经典示例,您可以使用 SQL CLR(公共语言运行时)在数据库级别(在 SQL Server 中运行的 .NET 代码)实现这一目标
    【解决方案4】:

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

    CASE WHEN dbo.RegExFind
        (
        'joe@stackoverflow.com',
        '^[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

    【讨论】:

      【解决方案5】:

      正如其他人所提到的,您可以使用正则表达式来验证电子邮件,但准确性有限。

      -- you could, but not recommended
      SELECT email, email LIKE '%_@_%.__%' AS isVaild FROM people;
      

      您可能会发现使用Real Email 之类的服务来验证电子邮件会更好,它不仅会检查电子邮件是否正确,还会检查域和帐户是否有效。

      您可以将数据导出为 csv,然后对其进行验证。更多信息请见How to validate emails in an sql database

      【讨论】:

        猜你喜欢
        • 2022-01-21
        • 1970-01-01
        • 2020-06-06
        • 2011-10-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-07-30
        相关资源
        最近更新 更多