2013-03-20 13 views
5

Bir e-postanın normal ifadelerle geçerli bir biçimde olup olmadığını kontrol etmek için SQL Server 2005'te bir işlev oluşturmaya çalışıyorum. Benim düzenli ifade ile yanlış bir şey yapıyorumRegex kullanarak SQL Email Doğrulama İşlevi

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 

Am: Burada

var bugüne kadar ne? Ya da bir varchar'ı normal bir ifadeyle karşılaştırmak için daha fazla şey yapmak zorunda mıyım? Şu anda

-Edit-

ne olursa olsun dize ben e-posta biçimi kendisi doğru olsa bile, geri dönüşler bir 0 koymak.

+0

Bunun sizin sorununuz olduğunu düşünmüyorum, fakat au'dan sonra fazladan bir '' 'var. –

+0

@ acheong87 Sorun bu değildi. Teşekkür ederim, çünkü bir çözüm bulduğumda yolun ilerleyen kısımlarında bana yardımcı olabilir. –

cevap

5

Kısa cevap, hayır, bu yapılamaz. LIKE sözdizimi, normal ifadelerle (ve daha az güçlü olan) aynı değildir. Ayrıca bkz. SQL Server Regular expressions in T-SQL

Ancak atlama işlemini .Net yapın ve oradaki eşleştirmeyi yapabilirsiniz. VBScript.RegExp'u, sp_OACreate'u kullanarak T-SQL içinde başlatabilir ve bunu kullanabilirsiniz.

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 

Eğer biraz daha az kısıtlayıcı izin hangi karakterler üzerinde olmak istiyorsanız görmek için Regex email verification error - using JavaScript bir göz atmanız yapın. aşağıdaki gibi

+0

Teşekkür ederim @flup. Bir program yazmayı denemeye çalışıyordum, ama sanırım gerekecek. Bunu kullanan bir programım var, sadece müşteri verilerini iki farklı yerde karşılaştırmak istemedim. –

+0

Bir program olup olmadığından emin değilim. Regexp nesnesi INSIDE SQL Server'ı başlatabilir ve yöntemlerini çağırabilirsiniz. Kodu cevaba ekleyeceğim. – flup

+0

Güncelleme için teşekkürler! Kodunuzdaki tek hata, SET @ pattern = '(a-zA-Z0-9 _ \ -] + @ ([a-zA-Z0-9 _ \ -] + \.) + (Com | org)' a ihtiyaç duymanızdır. | edu | nz | au]) ' –

2

Ben cevabını @flup kullanılan ve RegExp deseni güncelleme:

  • nokta ancak ilk veya ifade demirlemiş orada
  • son karakteri olarak, @ önce kısmına izin verilir başlangıç ​​ve birlikte dize sonu^ve $
  • belirli TLD'leri ve ülke kodları nerede .c birçok yazım hatası dışlamak için TLD'leri açıkça beyaz listeye alındı ​​

kullanıyordum veriler için eklendi om .co veya .cm olarak girildi - Kolombiya veya Kamerun için geçerli ülke kodları ancak verilerim için değil.

güncellenmiş hattı:

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)$' 

Bunun halihazırda mükemmel cevap değer katar umuyoruz.