Sql-Server
CHECK 約束以強制執行###.###.#### 模式匹配
我想要一個檢查約束,對多部分程式碼強制執行此正則表達式模式:
^\d{3}\.\d{3}\.\d{4}$
…三個數字,一個句點,三個數字,一個句點,四個數字。
是否需要創建 CLR 函式來強制執行模式匹配,是否可以在 DDL 中引用 CLR 函式?
有沒有辦法以另一種方式強制執行模式,使用
LIKE
?
您問題中的正則表達式並非完全明確
在大多數支持 Unicode 的風格中,\d 包括來自所有腳本的所有數字。值得注意的例外是 Java、JavaScript 和 PCRE。這些 Unicode 風格只匹配帶有 \d 的 ASCII 數字。
所以在許多口味中它都會匹配
١١١.١١١.١١١١
(那個字元是Arabic-Indic Digit One)我假設您只想匹配 latin
0-9
。您可以使用DECLARE @T TABLE ( Col CHAR(12) CHECK ( Col LIKE REPLACE('ddd.ddd.dddd','d','[0-9]') COLLATE Latin1_General_100_BIN2 ) )
我正在使用二進制整理子句,因此字元串喜歡
¾¾¾.¾¾¾.¾¾¾¾
或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'0-9'+ N']' COLLATE Latin1_General_100_BIN2