2009-01-08 8 views
6

Ich habe dieses Szenario, wo ich Datenintegrität in der physischen Datenbank benötigen. Zum Beispiel habe ich eine Variable von @email_address VARCHAR(200) und ich möchte überprüfen, ob der Wert @email_address E-Mail-Format ist. Hat jemand eine Idee, wie man das Format in T-SQL überprüft?T-SQL: Überprüfung auf E-Mail-Format

Vielen Dank!

+0

mögliche Duplikate von [SQL-Skript, um ungültige E-Mail-Adressen zu finden] (http://stackoverflow.com/questions/801166/sql-script-to-find-invalid-email-addresses) – Neolisk

Antwort

17

Ich testete die folgende Abfrage mit vielen verschiedenen falschen und gültigen E-Mail-Adressen. Es sollte die Arbeit machen.

IF (
    CHARINDEX(' ',LTRIM(RTRIM(@email_address))) = 0 
AND LEFT(LTRIM(@email_address),1) <> '@' 
AND RIGHT(RTRIM(@email_address),1) <> '.' 
AND CHARINDEX('.',@email_address ,CHARINDEX('@',@email_address)) - CHARINDEX('@',@email_address) > 1 
AND LEN(LTRIM(RTRIM(@email_address))) - LEN(REPLACE(LTRIM(RTRIM(@email_address)),'@','')) = 1 
AND CHARINDEX('.',REVERSE(LTRIM(RTRIM(@email_address)))) >= 3 
AND (CHARINDEX('[email protected]',@email_address) = 0 AND CHARINDEX('..',@email_address) = 0) 
) 
    print 'valid email address' 
ELSE 
    print 'not valid' 

Es prüft diese Bedingungen: ''

  • keine eingebetteten Leerzeichen
  • '@'
  • das erste Zeichen einer E-Mail-Adresse kann nicht sein
  • kann nicht das letzte Zeichen einer E-Mail-Adresse sein
  • Es muss ein '.' irgendwo nach ‚@‘
  • das Zeichen ‚@‘
  • Domain-Namen mit mindestens 2 Zeichen-Erweiterung enden sollten
  • nicht haben können Muster wie ‚@‘ und ‚..‘
erlaubt ist
+0

danke! Ich hatte keine Ahnung von den Bedingungen, die du gepostet hast. Danke für die Antwort! – jerbersoft

+0

@splattne ...Diese Funktion funktioniert nicht auf mssql 2008. Es ist großartig, funktioniert auf mssql 2012, aber nicht auf 2008 – IBM

1

Wenn Sie SQL 2005 oder 2008 verwenden, können Sie CLR-gespeicherte Prozeduren schreiben und die .NET-Regex-Engine like this verwenden. Wenn Sie SQL 2000 oder früher verwenden, können Sie den regulären Ausdruck der VBScript-Scripting-Engine like ths verwenden. Sie könnten auch eine erweiterte gespeicherte Prozedur verwenden like this

8

AFAIK gibt es keinen guten Weg, dies zu tun. Der E-Mail-Format-Standard ist so komplex, dass Parser dafür bekannt sind, Tausende von Codezeilen zu verwenden, aber selbst wenn Sie ein einfacheres Formular verwenden würden, das einige obskure, aber gültige Adressen nicht erfüllen würde reguläre Ausdrücke, die von T-SQL nicht nativ unterstützt wird (wieder, ich bin nicht zu 100% auf das), Sie mit einem einfachen Rückfall von somethign wie verlassen:

LIKE '%[email protected]_%_.__%'

..oder ähnlich.

Mein Gefühl ist im Allgemeinen, dass Sie dies nicht im letzten möglichen Moment tun sollten (wie Sie in eine DB einfügen) sollten Sie es bei der ersten Gelegenheit und/oder einem gemeinsamen Gateway (der Controller, der tatsächlich tun macht die SQL-Insert-Anfrage), wo Sie übrigens den Vorteil von Regex und möglicherweise sogar einer Bibliothek hätten, die die "echte" Validierung für Sie vornimmt.

+0

Für die grundlegende Validierung wird dies tun. –

1

Es gibt keinen einfachen Weg, es in T-SQL zu tun, fürchte ich. Um alle von RFC 2822 erlaubten E-Mail-Adressen zu validieren, müssen Sie einen regulären Ausdruck verwenden.

Weitere Informationen here.

Sie müssen Ihren Umfang definieren, wenn Sie ihn vereinfachen möchten.