检查约束以强制执行###.###.#### 模式匹配

mrb*_*int 11 sql-server constraint sql-server-2012

我想要一个检查约束,为多部分代码强制执行此正则表达式模式:

^\d{3}\.\d{3}\.\d{4}$
Run Code Online (Sandbox Code Playgroud)

...三个数字,一个句号,三个数字,一个句号,四个数字。

我是否需要创建一个 CLR 函数来强制执行模式匹配,并且可以在 DDL 中引用 CLR 函数吗?

有没有办法以另一种方式强制执行模式,使用LIKE?

Mar*_*ith 16

您问题中的正则表达式并非完全明确

在大多数支持 Unicode 的风格中,\d 包括来自所有脚本的所有数字。值得注意的例外是 Java、JavaScript 和 PCRE。这些 Unicode 风格仅匹配带有 \d 的 ASCII 数字。

所以在许多口味中它会匹配???.???.????(那个字符是阿拉伯-印度数字一

我假设您只想匹配 latin 0-9。您可以使用

DECLARE  @T TABLE
(
Col CHAR(12) CHECK (
                   Col LIKE REPLACE('ddd.ddd.dddd','d','[0-9]') 
                                  COLLATE Latin1_General_100_BIN2
                   )
)
Run Code Online (Sandbox Code Playgroud)

我正在使用二进制 collat​​e 子句,因此字符串喜欢¾¾¾.¾¾¾.¾¾¾¾10².10².1000不通过检查 (可能发生在某些排序规则上)。

这些都不会匹配所需的 CLR 正则表达式,尽管使用集合语法 ( [0123456789]) 而不是范围语法 ( [0-9]) 解析第一个它仍然取决于排序规则是否2匹配²

我使用REPLACE而不是硬编码LIKE模式,因为我发现模式检查的内容更具可读性。比解析更容易看到三个数字和一个点,然后是三个数字,另一个点然后是四个数字[0-9][0-9][0-9].[0-9] [0-9][0-9].[0-9][0-9][0-9][0-9].

它还可以更轻松地更换实现。

我确实决定您想要 CLR 正则表达式的完整语义,毕竟您可以将'[0-9]'上面更改为下面(并且可能NCHAR(12)在这种情况下将列更改为)

'[' +
 /*48-57 Basic Latin*/
N'0-9'+
 /*1632-1641 Arabic-Indic*/
N'?-?'+
 /*1776-1785 Extended Arabic-Indic*/
N'?-?'+
 /*1984-1993 Nko*/
N'?-?'+
 /*2406-2415 Devanagari*/
N'?-?'+
 /*2534-2543 Bengali*/
N'?-?'+
 /*2662-2671 Gurmukhi*/
N'?-?'+
 /*2790-2799 Gujarati*/
N'?-?'+
 /*2918-2927 Oriya*/
N'?-?'+
 /*3046-3055 Tamil*/
N'?-?'+
 /*3174-3183 Telugu*/
N'?-?'+
 /*3302-3311 Kannada*/
N'?-?'+
 /*3430-3439 Malayalam*/
N'?-?'+
 /*3558-3567 Sinhala*/
N'?-?'+
 /*3664-3673 Thai*/
N'?-?'+
 /*3792-3801 Lao*/
N'?-?'+
 /*3872-3881 Tibetan*/
N'?-?'+
 /*4160-4169 Myanmar*/
N'?-?'+
 /*4240-4249 Myanmar Shan*/
N'?-?'+
 /*6112-6121 Khmer*/
N'?-?'+
 /*6160-6169 Mongolian*/
N'?-?'+
 /*6470-6479 Limbu*/
N'?-?'+
 /*6608-6617 New Tai Lue*/
N'?-?'+
 /*6784-6793 Tai Tham Hora*/
N'?-?'+
 /*6800-6809 Tai Tham Tham*/
N'?-?'+
 /*6992-7001 Balinese*/
N'?-?'+
 /*7088-7097 Sundanese*/
N'?-?'+
 /*7232-7241 Lepcha*/
N'?-?'+
 /*7248-7257 Ol Chiki*/
N'?-?'+
 /*42528-42537 Vai*/
N'?-?'+
 /*43216-43225 Saurashtra*/
N'?-?'+
 /*43264-43273 Kayah Li*/
N'?-?'+
 /*43472-43481 Javanese*/
N'?-?'+
 /*43504-43513 Myanmar Tai Laing*/
N'?-?'+
 /*43600-43609 Cham*/
N'?-?'+
 /*44016-44025 Meetei Mayek*/
N'?-?'+
 /*65296-65305 Fullwidth*/
N'?-?'+
N']'  COLLATE Latin1_General_100_BIN2
Run Code Online (Sandbox Code Playgroud)