Tôi muốn đặt một ràng buộc trên một cột email như vậy: xxxx@xxxx.yyy Rõ ràng "x" có độ dài khác nhau và x là một phần của dữ liệu chuỗi và .yyy là một loại tên miền của .com, .gov, v.v.
Tôi muốn đặt một ràng buộc trên một cột email như vậy: xxxx@xxxx.yyy Rõ ràng "x" có độ dài khác nhau và x là một phần của dữ liệu chuỗi và .yyy là một loại tên miền của .com, .gov, v.v.
Câu trả lời:
Đây là một nhiệm vụ quá lớn nếu bạn muốn thực hiện đúng cách. Nếu bạn có thể sử dụng SQL CLR mặc dù đây là cách chúng tôi làm điều đó tại công ty của chúng tôi:
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;
}
}
}
Và sau đó giả sử bạn triển khai nó vì dbo.fn_IsValidEmail
bạn có thể sử dụng nó trong ràng buộc kiểm tra của mình giống như bất kỳ hàm vô hướng nào khác như vậy:
create table dbo.tbl
(
id int identity not null,
email nvarchar(256) not null,
constraint ck_tbl_isValidEmail check (dbo.fn_IsValidEmail (email))
);
Nếu cột của bạn cho phép NULL
thì bạn sẽ cần thay đổi phần đầu tiên của hàm này thành:
if (email == null)
return true;
if (email == string.Empty)
return false;
Tài liệu:
Tôi sử dụng như sau:
select * from api.ParseEmail('mail@domain.com');
Các TVF trả về ba giá trị: UserName (string)
, DomainName (string)
, vàIsValid (bit)
Điều này đảm bảo rằng chuỗi được truyền có "hình dạng" hợp lệ bởi vì, như những người khác đã chỉ ra, xác thực email là một công việc khó khăn (chủ yếu là vì những gì được coi là thay đổi hợp lệ tùy thuộc vào ngữ cảnh, cách sử dụng, quan điểm ...). Sau đó, bạn có thể dán bất cứ thứ gì bạn muốn "lên trên" bằng cách gói nó vào một chức năng khác.
Có thể bạn yêu cầu DomainName dài hơn X:
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;
Mã số:
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)
);