Ich möchte eine E-Mail-Spalte wie folgt einschränken: xxxx@xxxx.yyy Offensichtlich ist "x" unterschiedlich lang und x ist ein Teil der Zeichenfolgendaten, und .yyy ist ein Domänentyp von .com, .gov usw.
Ich möchte eine E-Mail-Spalte wie folgt einschränken: xxxx@xxxx.yyy Offensichtlich ist "x" unterschiedlich lang und x ist ein Teil der Zeichenfolgendaten, und .yyy ist ein Domänentyp von .com, .gov usw.
Antworten:
Dies ist eine viel zu große Aufgabe, wenn Sie sie richtig ausführen möchten. Wenn Sie SQL CLR verwenden können, gehen wir in unserem Unternehmen folgendermaßen vor:
using System;
using System.Net.Mail;
using Microsoft.SqlServer.Server;
namespace Functions
{
public static class Utilities
{
[SqlFunction]
public static bool IsValidEmail(string email)
{
if (string.IsNullOrEmpy(email))
return false;
bool isValid = false;
try
{
// use the validation provided by the System.Net.Mail.MailAddress class
var mailAddress = new MailAdress(email);
isValid = true;
}
catch(FormatException)
{
isValid = false;
}
return isValid;
}
}
}
Angenommen, Sie stellen es so bereit, wie dbo.fn_IsValidEmail
Sie es in Ihrer Prüfbedingung verwenden können, wie Sie es bei jeder anderen Skalarfunktion tun würden:
create table dbo.tbl
(
id int identity not null,
email nvarchar(256) not null,
constraint ck_tbl_isValidEmail check (dbo.fn_IsValidEmail (email))
);
Wenn Ihre Spalte dies zulässt, müssen NULL
Sie stattdessen den ersten Teil der Funktion wie folgt ändern:
if (email == null)
return true;
if (email == string.Empty)
return false;
Dokumentation:
Ich benutze folgendes:
select * from api.ParseEmail('mail@domain.com');
Die TVF gibt drei Werte: UserName (string)
, DomainName (string)
, undIsValid (bit)
Dies stellt sicher, dass die übergebene Zeichenfolge eine gültige "Form" hat, da das Validieren einer E-Mail, wie andere bereits betont haben, eine schwierige Angelegenheit ist (hauptsächlich, weil sich die als gültig geltenden Änderungen je nach Kontext, Verwendung, Meinung ... ändern). Sie können dann alles, was Sie wollen, "darüber" kleben, indem Sie es in eine andere Funktion einwickeln.
Möglicherweise benötigen Sie, dass DomainName länger als X ist:
select a.UserName
, a.DomainName
, case
when a.IsValid and Len(a.DomainName) > 2 then 1
else 0
end as IsValid
from api.ParseEmail as a;
Code:
create function api.ParseEmail (
@x nvarchar(256) = null
)
returns table
with schemabinding
as
return (
select UserName.s as UserName
, DomainName.s as DomainName
, case
when ([IndexOf@].n != 0 and UserName.s is not null and DomainName.s is not null) then 1
else 0
end as IsValid
from (values(PatIndex('%@%', @x))) as [IndexOf@] (n)
cross apply (values(NullIf(Substring(@x, 0, [IndexOf@].n), ''))) as UserName (s)
cross apply (values(NullIf(Substring(@x, [IndexOf@].n + 1, Len(@x) - [IndexOf@].n), ''))) as DomainName (s)
);