TSQL البريد الإلكتروني التحقق من صحة (بدون التعابير المنطقية)
-
04-07-2019 - |
سؤال
وطيب، وهناك مليون regexes هناك للتحقق من صحة عنوان البريد الإلكتروني، ولكن ماذا عن بعض التحقق من صحة البريد الإلكتروني الأساسية التي يمكن دمجها في استعلام TSQL ل SQL Server 2005؟
وأنا لا أريد أن استخدم إجراء CLR أو وظيفة. TSQL فقط التوالي.
وقد أي شخص تناول هذا بالفعل؟
المحلول
جدا م> الأساسية ستكون كما يلي:
SELECT
EmailAddress,
CASE WHEN EmailAddress LIKE '%_@_%_.__%'
AND EmailAddress NOT LIKE '%[any obviously invalid characters]%'
THEN 'Could be'
ELSE 'Nope'
END Validates
FROM
Table
وهذا يتطابق مع كل شيء مع @ في الوسط، يسبقها حرف واحد على الأقل، تليها اثنين على الأقل، نقطة واثنين على الأقل في TLD.
ويمكنك إرسال أكثر أنماط LIKE
أن تفعل أشياء أكثر تحديدا، ولكنك لن تكون قادرة على مواكبة كل ما يمكن أن يكون عنوان البريد الإلكتروني أثناء عدم السماح زلة من خلال الأشياء التي ليست كذلك. حتى مع التعابير العادية لديك صعوبة في القيام بذلك الحق. بالإضافة إلى ذلك، حتى مطابقة وفقا لخطابات جدا من RFC مباريات يبني العنوان الذي لن تقبل / المستخدمة من قبل معظم أنظمة البريد الإلكتروني.
والقيام بذلك على مستوى قاعدة البيانات ربما نهج خاطئ على أي حال، لذلك الاختيار التعقل الأساسي كما هو مبين أعلاه قد يكون أفضل ما يمكنك الحصول على الأداء الحكمة، وفعل ذلك في تطبيق توفر لك مع أكبر بكثير من المرونة.
نصائح أخرى
وهنا دالة نموذج لهذا هذا هو قليلا أكثر تفصيلا، وأنا لا أتذكر أين حصلت على هذا من (قبل سنوات)، أو إذا كنت تعديله، وإلا أود أن تشمل إسناد الصحيح:
CREATE FUNCTION [dbo].[fnAppEmailCheck](@email VARCHAR(255))
--Returns true if the string is a valid email address.
RETURNS bit
as
BEGIN
DECLARE @valid bit
IF @email IS NOT NULL
SET @email = LOWER(@email)
SET @valid = 0
IF @email like '[a-z,0-9,_,-]%@[a-z,0-9,_,-]%.[a-z][a-z]%'
AND LEN(@email) = LEN(dbo.fnAppStripNonEmail(@email))
AND @email NOT like '%@%@%'
AND CHARINDEX('.@',@email) = 0
AND CHARINDEX('..',@email) = 0
AND CHARINDEX(',',@email) = 0
AND RIGHT(@email,1) between 'a' AND 'z'
SET @valid=1
RETURN @valid
END
وإجابات عظيمة! تستند هذه التوصيات خطرت لي وظيفة مبسطة الذي يجمع بين أفضل 2 إجابات.
CREATE FUNCTION [dbo].[fnIsValidEmail]
(
@email varchar(255)
)
--Returns true if the string is a valid email address.
RETURNS bit
As
BEGIN
RETURN CASE WHEN ISNULL(@email, '') <> '' AND @email LIKE '%_@%_.__%' THEN 1 ELSE 0 END
END
وFnAppStripNonEmail المفقودين تحت درجة، تحتاج إضافة إلى القيم إبقاء
Create Function [dbo].[fnAppStripNonEmail](@Temp VarChar(1000))
Returns VarChar(1000)
AS
Begin
Declare @KeepValues as varchar(50)
Set @KeepValues = '%[^a-z,0-9,_,@,.,-]%'
While PatIndex(@KeepValues, @Temp) > 0
Set @Temp = Stuff(@Temp, PatIndex(@KeepValues, @Temp), 1, '')
Return @Temp
End
CREATE FUNCTION fnIsValidEmail
(
@email varchar(255)
)
RETURNS bit
AS
BEGIN
DECLARE @IsValidEmail bit = 0
IF (@email not like '%[^a-z,0-9,@,.,!,#,$,%%,&,'',*,+,--,/,=,?,^,_,`,{,|,},~]%' --First Carat ^ means Not these characters in the LIKE clause. The list is the valid email characters.
AND @email like '%_@_%_.[a-z,0-9][a-z]%'
AND @email NOT like '%@%@%'
AND @email NOT like '%..%'
AND @email NOT like '.%'
AND @email NOT like '%.'
AND CHARINDEX('@', @email) <= 65
)
BEGIN
SET @IsValidEmail = 1
END
RETURN @IsValidEmail
END
في SQL 2016 أو +
CREATE FUNCTION [DBO].[F_IsEmail] (
@EmailAddr varchar(360) -- Email address to check
) RETURNS BIT -- 1 if @EmailAddr is a valid email address
AS BEGIN
DECLARE @AlphabetPlus VARCHAR(255)
, @Max INT -- Length of the address
, @Pos INT -- Position in @EmailAddr
, @OK BIT -- Is @EmailAddr OK
-- Check basic conditions
IF @EmailAddr IS NULL
OR @EmailAddr NOT LIKE '[0-9a-zA-Z]%@__%.__%'
OR @EmailAddr LIKE '%@%@%'
OR @EmailAddr LIKE '%..%'
OR @EmailAddr LIKE '%.@'
OR @EmailAddr LIKE '%@.'
OR @EmailAddr LIKE '%@%.-%'
OR @EmailAddr LIKE '%@%-.%'
OR @EmailAddr LIKE '%@-%'
OR CHARINDEX(' ',LTRIM(RTRIM(@EmailAddr))) > 0
RETURN(0)
declare @AfterLastDot varchar(360);
declare @AfterArobase varchar(360);
declare @BeforeArobase varchar(360);
declare @HasDomainTooLong bit=0;
--Control des longueurs et autres incoherence
set @AfterLastDot=REVERSE(SUBSTRING(REVERSE(@EmailAddr),0,CHARINDEX('.',REVERSE(@EmailAddr))));
if len(@AfterLastDot) not between 2 and 17
RETURN(0);
set @AfterArobase=REVERSE(SUBSTRING(REVERSE(@EmailAddr),0,CHARINDEX('@',REVERSE(@EmailAddr))));
if len(@AfterArobase) not between 2 and 255
RETURN(0);
select top 1 @BeforeArobase=value from string_split(@EmailAddr, '@');
if len(@AfterArobase) not between 2 and 255
RETURN(0);
--Controle sous-domain pas plus grand que 63
select top 1 @HasDomainTooLong=1 from string_split(@AfterArobase, '.') where LEN(value)>63
if @HasDomainTooLong=1
return(0);
--Control de la partie locale en detail
SELECT @AlphabetPlus = 'abcdefghijklmnopqrstuvwxyz01234567890!#$%&‘*+-/=?^_`.{|}~'
, @Max = LEN(@BeforeArobase)
, @Pos = 0
, @OK = 1
WHILE @Pos < @Max AND @OK = 1 BEGIN
SET @Pos = @Pos + 1
IF @AlphabetPlus NOT LIKE '%' + SUBSTRING(@BeforeArobase, @Pos, 1) + '%'
SET @OK = 0
END
if @OK=0
RETURN(0);
--Control de la partie domaine en detail
SELECT @AlphabetPlus = 'abcdefghijklmnopqrstuvwxyz01234567890-.'
, @Max = LEN(@AfterArobase)
, @Pos = 0
, @OK = 1
WHILE @Pos < @Max AND @OK = 1 BEGIN
SET @Pos = @Pos + 1
IF @AlphabetPlus NOT LIKE '%' + SUBSTRING(@AfterArobase, @Pos, 1) + '%'
SET @OK = 0
END
if @OK=0
RETURN(0);
return(1);
END
Create Function [dbo].[fnAppStripNonEmail](@Temp VarChar(1000))
Returns VarChar(1000)
AS
Begin
Declare @KeepValues as varchar(50)
Set @KeepValues = '%[^a-z,0-9,@,.,-]%'
While PatIndex(@KeepValues, @Temp) > 0
Set @Temp = Stuff(@Temp, PatIndex(@KeepValues, @Temp), 1, '')
Return @Temp
End
وهذا هو أسهل طريقة لتحديدها.
استخدم هذا الاستعلام
SELECT * FROM <TableName> WHERE [EMail] NOT LIKE '%_@__%.__%'
ومن slelect Tomalak ل
select 1
where @email not like '%[^a-z,0-9,@,.]%'
and @email like '%_@_%_.__%'