Sql-Server

CHECK 約束以強制執行###.###.#### 模式匹配

  • September 23, 2016

我想要一個檢查約束,對多部分程式碼強制執行此正則表達式模式:

^\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

引用自:https://dba.stackexchange.com/questions/149945