【问题标题】:Regex CHECK constraint not working with SQL server正则表达式检查约束不适用于 SQL 服务器
【发布时间】:2012-08-13 13:41:24
【问题描述】:

我试图拒绝所有不是格式“03 xxxx xxxx”的输入,所以我创建了一个类似的表格

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 manager 添加它,我会收到一条错误消息: "INSERT 语句与 CHECK 约束 "num_check" 冲突"

起初我以为我的 Regex 已关闭,但我在其他几个地方尝试过,它接受了上面的示例。 有什么想法吗?

【问题讨论】:

  • 据我所知,如果不使用 CLR 程序集,您无法在 SQL Server 中实现正则表达式。它不像 Oracle 那样支持本地正则表达式……除非我的记忆力让我失望。
  • 我正在关注我在这里看到的一些东西。 dbforums.com/microsoft-sql-server/…
  • 到目前为止,我只找到了一个支持 posix 正则表达式约束的 DBE,它是 Oracle(参考:stackoverflow.com/questions/35157662/…)。 MS SQL 和 DB2 看起来它们有自己的通配符变体,这是不幸的,因为您失去了层之间约束的一致性:(
  • DBA 网站上的相关 QA...dba.stackexchange.com/q/266438/3690

标签: regex sql-server-2008 tsql check-constraints


【解决方案1】:

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

【讨论】:

  • 这将教会我如何让我的正则表达式更简洁、更简洁。谢谢科比
  • @TrewTzu - 这正是问题所在 - like 不处理正则表达式 - 只有 [] 类似。无论如何,我已经包含了另一个版本 - 我在检查 GUID 时做了非常相似的事情,并且不希望 [0-9a-fA-F] 重复 32 次......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-10
  • 2020-05-10
  • 1970-01-01
  • 2013-05-01
  • 1970-01-01
相关资源
最近更新 更多