T-SQL: проверка формата электронной почты - PullRequest
7 голосов
/ 08 января 2009

У меня есть такой сценарий, когда мне нужна целостность данных в физической базе данных. Например, у меня есть переменная @email_address VARCHAR(200), и я хочу проверить, имеет ли значение @email_address формат электронной почты. У кого-нибудь есть идеи, как проверить формат в T-SQL?

Большое спасибо!

Ответы [ 4 ]

18 голосов
/ 08 января 2009

Я проверил следующий запрос со многими разными неправильными и действительными адресами электронной почты. Это должно сделать работу.

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_address ) = 0 AND CHARINDEX('..',@email_address ) = 0)
)
   print 'valid email address'
ELSE
   print 'not valid'

Проверяет эти условия:

  • Нет встроенных пробелов
  • '@' не может быть первым символом адреса электронной почты
  • '' не может быть последним символом адреса электронной почты
  • Должно быть "." где-то после '@'
  • знак '@' разрешен
  • Доменное имя должно заканчиваться как минимум 2-х символьным расширением
  • не может иметь таких шаблонов, как '. @' И '..'
8 голосов
/ 08 января 2009

AFAIK, нет хорошего способа сделать это.

Стандарт формата электронной почты настолько сложен, что, как известно, синтаксические анализаторы работают с тысячами строк кода, но даже если бы вы использовали более простую форму, которая не давала бы некоторые неясные, но действительные адреса, вам пришлось бы делать это без регулярного выражения, которые не поддерживаются T-SQL (опять же, я не на 100%), оставляя вас с простым отступлением от некоторого числа, например:

LIKE '%_@_%_.__%'

.. или аналогичный.

Обычно я чувствую, что вы не должны делать это в самый последний момент, хотя (когда вы вставляете в БД), вы должны делать это при первой возможности и / или с общим шлюзом (контроллером, который фактически делает запрос вставки SQL), где, между прочим, у вас было бы преимущество регулярного выражения и, возможно, даже библиотека, которая выполняет «реальную» проверку для вас.

1 голос
/ 08 января 2009

Боюсь, в T-SQL нет простого способа сделать это. Для проверки всех разновидностей адресов электронной почты, разрешенных RFC 2822 , вам необходимо использовать регулярное выражение.

Подробнее здесь .

Вам нужно будет определить свою сферу, если вы хотите ее упростить.

1 голос
/ 08 января 2009

Если вы используете SQL 2005 или 2008, возможно, вы захотите посмотреть на запись хранимых процедур CLR и использовать механизм регулярных выражений .NET , например, . Если вы используете SQL 2000 или более раннюю версию, вы можете использовать регулярное выражение механизма сценариев VBScript, например ths . Вы также можете использовать расширенную хранимую процедуру , например,

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...