2013-03-20 6 views
5

電子メールが正規表現で有効な形式であるかどうかを確認するためにSQL Server 2005で関数を作成しようとしています。ここでRegexを使用したSQL電子メール検証機能

は、私がこれまで何をしているされています

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

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

は、私は私の正規表現と間違って何かをやっていますか?または、varcharと正規表現を比較するために何か他の処理を行う必要がありますか?今

-Edit-

、どんな文字列私は、電子メールの形式自体は正しくても、返品に0を置きます。

+0

私はこれがあなたの問題だとは思わないが、 'au'の後ろに'] 'があります。 –

+0

@ acheong87それは問題ではありませんでした。ありがとう、それは私が解決策を見つけたときにそれが後に道路を助けることができたからです。 –

答えて

5

短い答えは、いいえ、できません。 LIKEの構文は、正規表現と同じではありません。関連項目SQL Server Regular expressions in T-SQL

しかし、あなたは.Netへのホップを行い、そこでマッチングを行うことができます。 sp_OACreateを使用してT-SQL内でVBScript.RegExpをインスタンス化して使用することができます。

CREATE FUNCTION dbo.isValidEmailFormat 
(
    @Email varchar(100) 
) 
RETURNS bit 
AS 
BEGIN 
    DECLARE @pattern varchar(4000) 
    SET @pattern = '[a-zA-Z0-9_\-][email protected]([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 email verification error - using JavaScriptでかいま見を取りません。

+0

ありがとう@flup。私はプログラムを書くのを避けようとしていましたが、私はそうしなければならないと思います。私はこれを使用するプログラムを持っていますが、私はちょうど2つの異なる場所で顧客データを比較したくありませんでした。 –

+0

私はそれをプログラムと呼ぶかどうか分かりません。 INSIDE SQL Serverのregexpオブジェクトをインスタンス化し、そのメソッドを呼び出すことができます。私は答えにコードを追加します。 – flup

+0

更新ありがとうございます!あなたのコードの唯一のエラーは、SET @pattern = '[a-zA-Z0-9 _ \ - ] + @([a-zA-Z0-9 _ \ - ] + \)+(com | org | edu | nz | au]) ' –

2

私はの答えを@flup使用し、次のように正規表現パターンを更新:

  • ドットは式がに固定されて
  • @の前の部分で許可さではなく、最初または最後の文字などが
  • されています起動した文字列の末尾^と$
  • 特定のTLDと国コードは、私がどこ.C多くのタイプミスを除外するのTLDが明示的にホワイトリストに登録されている

を使用していたデータのために追加されましたコロンビアまたはカメルーンの有効な国コードである.coまたは.cmとして入力されましたが、私のデータではありません。

更新行:

SET @pattern = '^([a-zA-Z0-9_\-]+\.)*[a-zA-Z0-9_\-][email protected]([a-zA-Z0-9_\-]+\.)+(com|org|edu|net|ca|au|coop|de|ee|es|fm|fr|gr|ie|in|it|jp|me|nl|nu|ru|uk|us|za)$' 

私は、これはすでに優秀な答えに付加価値を願っています。

関連する問題