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)
我正在使用二进制 collate 子句,因此字符串喜欢¾¾¾.¾¾¾.¾¾¾¾或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)
| 归档时间: |
|
| 查看次数: |
2236 次 |
| 最近记录: |