我正在尝试创建一个带有电子邮件地址列的表,并希望确保仅允许使用正确格式的地址(包含“ @”)。我知道如何在查询中使用LIKE
运算符,但不知道如何在列上设置值约束。
答案 0 :(得分:0)
您可以像这样为基本示例添加检查约束:
alter table t add contraint chk_email
(check (email like '%@%') );
当然,那实际上只是一个下注。也许更像这样:
alter table t add contraint chk_email
(check (email like '%_@[^.]%' and -- one @ and something before and after
email not like '%@%@%' and -- not more than one @
email not like '%[^-.a-zA-Z0-9_]%' -- valid characters)
);
这仍将允许无效的电子邮件,但至少距离更近。
答案 1 :(得分:0)
最好使用支持正则表达式或已经内置isValidEmail
方法的编程语言来完成。
使用正则表达式或简单的like
模式验证电子邮件地址非常困难,即使不是几乎不可能。
您可以在I Knew How To Validate An Email Address Until I Read The RFC上了解更多相关信息-并引用我认为最能说明问题的部分:
这些都是有效的电子邮件地址!
- Abc @ def @ example.com
- Fred \ Bloggs@example.com
- Joe。\ Blow@example.com
- “ Abc @ def” @ example.com
- “ Fred Bloggs” @ example.com
- customer/department=shipping@example.com
- $A12345@example.com
- !def!xyz%abc@example.com
- _somename@example.com
尝试获得在T-SQL语句中验证如此广泛的可能性所需的所有逻辑,就像尝试用双手在背后绑住盲目地攀登珠穆朗玛峰一样。
您可以使用简单的like
模式(例如Pinal Dave在How to Validate Email Address in SQL Server?中建议的模式)进行简单的验证,以返回很多假阳性或假阴性:'%_@__%.__%'
,但这实际上只是用创可贴堵塞大坝的天真尝试。
话虽如此,您也许可以使用CLR Scalar-Valued Function中的代码,使用this SO post来验证电子邮件地址。
我个人没有CLR函数的经验,因此尝试为您编写代码示例对我来说可能是不负责任的(特别是因为在发布此答案之前我没有真正的测试环境来检查它) ,但我希望到目前为止所写的内容能对您有所帮助,并且借助此答案中的链接和一些网络搜索,您将能够解决问题。