在sql 2008上有脑痉挛。拥有第三方应用和数据库,电话分机字段定义为varchar(5)
。问题是他们有一个报告(无法改变),除了数字之外的任何错误都被作为值放入,当然varchar(5)
他们可以放置任何报告错误。想要设置约束来限制最多5个数字的值,包括前导零或空值。在语法上苦苦挣扎。这就是我到目前为止所做的事情
查询
ALTER TABLE dbo.person_test2 ADD CONSTRAINT CK_ext
CHECK (Pext like '[0-9][0-9][0-9][0-9][0-9]')
不会全部为空,必须为5个字符。 它背后的原因是什么?
答案 0 :(得分:2)
CHECK (Pext Not like '%[^0-9]%' collate latin1_general_bin)
只需要你。
无需专门处理NULL
。如果条件评估为未知,则不违反约束。
^
否定指定的范围,因此对于不包含非数字字符的字符串,此条件的计算结果为true。
如果还应禁止空字符串,则可能需要添加AND Pext <> ''
。
binary collate子句可防止¼
匹配等字符。在许多排序规则中,它们在0到9之间排序,因此将包含在0-9
范围内。
答案 1 :(得分:1)
这个怎么样:
ALTER TABLE dbo.person_test2 ADD CONSTRAINT CK_ext
CHECK (Pext like '[0-9]' OR
Pext like '[0-9][0-9]' OR
Pext like '[0-9][0-9][0-9]' OR
Pext like '[0-9][0-9][0-9][0-9]' OR
Pext like '[0-9][0-9][0-9][0-9][0-9]'
)
此约束允许NULL
值以及长度介于1和5之间的所有数字。其他所有值都被禁止。
在考虑到Martin Smiths回答的正确评论后编辑。