一尘不染

使用Regex的SQL电子邮件验证功能

sql

我正在尝试在SQL Server 2005中创建一个函数,以检查电子邮件是否为带有正则表达式的有效格式。

这是我到目前为止的内容:

CREATE FUNCTION isValidEmailFormat
(
    @Email varchar(100)
)
RETURNS bit
AS
BEGIN
   DECLARE @Result bit

   SET @Result = (SELECT CASE
                     WHEN @Email LIKE '%[a-zA-Z0-9_\-]+@([a-zA-Z0-9_\-]+\.)+  (com|org|edu|nz|au])%' 
                       THEN 1
                       ELSE 0
                  END AS Valid)
   RETURN @Result
END

我的正则表达式做错什么了吗?还是我需要做更多的工作才能将varchar与正则表达式进行比较?

-编辑-

现在,即使电子邮件格式本身正确,我输入的任何字符串都将返回0。


阅读 114

收藏
2021-05-23

共1个答案

一尘不染

简短的答案是不,这是无法完成的。LIKE的语法与正则表达式不同(并且功能不如正则表达式)。

但是您可以跳到.Net并在那里进行匹配。您可以VBScript.RegExp使用sp_OACreate实例化内部T-SQL并使用它。

CREATE FUNCTION dbo.isValidEmailFormat
(
    @Email varchar(100)
)
RETURNS bit
AS
BEGIN
    DECLARE @pattern varchar(4000)
    SET @pattern = '[a-zA-Z0-9_\-]+@([a-zA-Z0-9_\-]+\.)+(com|org|edu|nz|au)'
    DECLARE @Result bit

    DECLARE @objRegexExp INT
    EXEC sp_OACreate 'VBScript.RegExp', @objRegexExp OUT

    EXEC sp_OASetProperty @objRegexExp, 'Pattern', @pattern
    EXEC sp_OASetProperty @objRegexExp, 'IgnoreCase', 1
    EXEC sp_OASetProperty @objRegexExp, 'MultiLine', 0
    EXEC sp_OASetProperty @objRegexExp, 'Global', false
    EXEC sp_OASetProperty @objRegexExp, 'CultureInvariant', true

    EXEC sp_OAMethod @objRegexExp, 'Test', @Result OUT, @Email

    EXEC sp_OADestroy @objRegexExp

    RETURN @Result
END

快看一下Regex电子邮件验证错误-使用JavaScript来查看您是否希望对允许使用哪些字符的限制有所减少。

2021-05-23