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


Если вы используете SQL 2005 или 2008, вам может потребоваться написать хранимые процедуры CLR и использовать механизм регулярных выражений .NET как это. Если вы используете SQL 2000 или более раннюю версию, вы можете использовать регулярное выражение как это движка сценариев VBScript. Вы также можете использовать расширенную хранимую процедуру как это
Я проверил следующий запрос с множеством разных неправильных и действительных адресов электронной почты. Он должен делать свою работу.
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'
Он проверяет эти условия:
Благодарность! Я понятия не имел об условиях, которые вы разместили. Спасибо за ответ!
@splattne ... эта функция не работает на mssql 2008. это отличная функция, работающая на mssql 2012, но не на 2008
AFAIK нет хорошего способа сделать это.
Стандарт формата электронной почты настолько сложен, что синтаксические анализаторы могут обрабатывать тысячи строк кода, но даже если бы вы использовали более простую форму, которая вызвала бы сбой некоторых неясных, но действительных адресов, вам пришлось бы делать это без регулярных выражений, которые являются не поддерживается изначально T-SQL (опять же, я не на 100% в этом отношении), оставляя вам простой запасной вариант, например:
LIKE '%_@_%_.__%'
..или похожие.
Мне кажется, что вы не должны делать это в последний возможный момент, хотя (когда вы вставляете в БД) вы должны делать это при первой возможности и / или через общий шлюз (контроллер, который фактически выполняет вставку SQL request), где, кстати, у вас будет преимущество регулярного выражения и, возможно, даже библиотеки, которая выполняет «настоящую» проверку за вас.
Для базовой проверки этого достаточно.
возможный дубликат Sql-скрипт для поиска недопустимых адресов электронной почты