2012-08-13 41 views
3

进出口工作努力没有拒绝其格式为“03 XXXX XXXX”,所以我创建了一个表像正则表达式CHECK约束与SQL Server

create table records 
(
.... 
num varchar(255) NOT NULL, 
... 
CONSTRAINT num_check CHECK (num like '03 [0-9]{4} [0-9]{4}') 
) 

应(我想?)接受例如“所有输入03 1234 1234“。但如果我尝试通过SQL管理器添加此错误消息: “INSERT语句与CHECK约束冲突”num_check“”

起初我认为我的正则表达式已关闭,但是我试图在很少有其他地方,它接受上面的例子。 有什么想法?

+1

至于我知道你不能在SQL Server中实现Regex而不使用CLR程序集。它没有像Oracle这样的原生Regex支持......除非我的记忆让我失望。 – scarpacci 2012-08-13 05:04:47

+0

我正在关注我在这里看到的一些事情。 http://www.dbforums.com/microsoft-sql-server/714703-check-constraint-regular-expressions.html – TrewTzu 2012-08-13 05:05:46

+0

到目前为止,我只找到一个支持posix regex约束的DBE,它是Oracle(参考: http://stackoverflow.com/questions/35157662/is-there-a-database-engine-that-allows-for-queriable-field-constraint-specified)。 MS SQL和DB2看起来像他们有自己的通配符变体,这是不幸的,因为你松散层之间的约束一致性:( – 2016-02-02 16:52:06

回答

7

like不使用正则表达式的工作,它有自己的,更简单的通配符模式,只支持%_[a-z][^a-z]。而已。 {4}将不起作用,就像大多数正则表达式一样。
您应该能够使用:

like '03 [0-9][0-9][0-9][0-9] [0-9][0-9][0-9][0-9]' 

另一种选择,少一些重复:

declare @digitChar nvarchar(12) 
set @digitChar = '[0-9]' 

Where子句:

like '03 ' + replicate(@digitChar,4) + ' ' + replicate(@digitChar,4) 

例子:http://sqlfiddle.com/#!3/d41d8/3251

+0

,这将教我试图使我的正则表达式更简洁,谢谢Kobi – TrewTzu 2012-08-13 05:29:11

+1

@TrewTzu - 这就是问题 - '''不处理正则表达式 - 它只是'[]'是类似的。无论如何,我已经包含了另一个版本 - 我做了一些非常类似的检查GUID时,并不希望'[0 -9a-fA-F]'重复32次... – Kobi 2012-08-13 05:34:01