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


11

我希望有一个检查约束,可以对多部分代码强制执行此正则表达式模式:

^\d{3}\.\d{3}\.\d{4}$

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

我是否需要创建CLR函数来实施模式匹配,并且可以在DDL中引用CLR函数吗?

有没有一种方法可以使用另一种方式来实施模式LIKE

Answers:


16

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

在大多数支持Unicode的版本中,\ d包括所有脚本中的所有数字。值得注意的例外是Java,JavaScript和PCRE。这些Unicode样式仅将\ d与ASCII数字匹配。

因此,在许多口味中它都可以匹配١١١.١١١.١١١١(该字符为阿拉伯文印度数字1

我假设您只是想匹配拉丁语0-9。您可以使用

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

我正在使用二进制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]

这也使交换实施变得更加容易。

我确实决定要在所有内容都可以从'[0-9]'上方更改为下方之后(并且NCHAR(12)在这种情况下也可以将列更改为),从而希望CLR正则表达式具有完整的语义。

'[' +
 /*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'0-9'+
N']'  COLLATE Latin1_General_100_BIN2
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.