Проверка электронной почты TSQL (без регулярного выражения)

Хорошо, существует миллион регулярных выражений 9X_transact-sql для проверки адреса электронной почты, но 9X_ms-sql-server как насчет базовой проверки электронной 9X_tsql почты, которую можно интегрировать в запрос 9X_mssql TSQL для Sql Server 2005?

Я не хочу использовать 9X_sql-server процедуру или функцию CLR. Просто прямой 9X_tsql TSQL.

Кто-нибудь уже занимался этим?

31
0
6
Общее количество ответов: 6

Ответ #1

Ответ на вопрос: Проверка электронной почты TSQL (без регулярного выражения)

Очень базовый вариант:

SELECT EmailAddress, CASE WHEN EmailAddress LIKE '%_@_%_.__%' AND EmailAddress NOT LIKE '%[any obviously invalid characters]%' THEN 'Could be' ELSE 'Nope' END Validates FROM Table 

Это соответствует всему, что 9X_transact-sql имеет символ @ в середине, которому предшествует 9X_email-validation как минимум один символ, за которым следует 9X_ms-sql-server как минимум два, точка и как минимум два 9X_sql-server для TLD.

Вы можете написать больше шаблонов 9X_sql-srever LIKE, которые делают более конкретные вещи, но 9X_email-validation вы никогда не сможете сопоставить все, что 9X_transact-sql может быть адресом электронной почты, не 9X_email-validation упуская при этом то, чего нет. Даже с регулярными 9X_sql-srever выражениями сложно сделать это правильно. Кроме 9X_sql-server того, даже соответствие по буквам RFC соответствует 9X_sql-server конструкциям адреса, которые не будут приняты 9X_mssql / использованы большинством систем электронной 9X_tsql почты.

Выполнение этого на уровне базы данных 9X_sql-srever в любом случае может быть неправильным подходом, поэтому 9X_mssql базовая проверка работоспособности, как 9X_email-validation указано выше, может быть лучшим из возможных 9X_transact-sql с точки зрения производительности, а выполнение 9X_mssql ее в приложении обеспечит вам гораздо большую 9X_email-validation гибкость.

54
1

  • Спасибо большое. Я просто использовал. Одна ошибка адреса электронной почты, с которой мы сталкиваемся, - это когда это [email protected] действительный адрес электронной почты. Я думаю, что выражение следует изменит ...

Ответ #2

Ответ на вопрос: Проверка электронной почты TSQL (без регулярного выражения)

Вот пример функции для этого, которая немного 9X_transact-sql более подробно, я не помню, откуда я это 9X_tsql взял (много лет назад), и если бы я ее изменил, иначе 9X_ms-sql-server я бы включил правильную атрибуцию:

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 

20
2

  • Мне нужно было добавить условие `AND CHARINDEX (', @ email) = 0`, чтобы проверять наличие пробелов в середине ад ...

Ответ #3

Ответ на вопрос: Проверка электронной почты TSQL (без регулярного выражения)

Отличные ответы! Основываясь на этих рекомендациях, я 9X_mssql придумал упрощенную функцию, которая сочетает 9X_ms-sql-server в себе два лучших ответа.

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 

3
0

Ответ #4

Ответ на вопрос: Проверка электронной почты TSQL (без регулярного выражения)

FnAppStripNonEmail отсутствует под оценкой, необходимо 9X_sql-server добавить его в значения сохранения

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 

1
0

Ответ #5

Ответ на вопрос: Проверка электронной почты TSQL (без регулярного выражения)

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 
9X_sql-srever
1
0

Ответ #6

Ответ на вопрос: Проверка электронной почты TSQL (без регулярного выражения)

В 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 

9X_sql-srever

1
0