CHECK-Einschränkung zum Erzwingen der ###. ###. #### Musterübereinstimmung

11

Ich hätte gerne eine Prüfbedingung, die dieses Regex-Muster für einen mehrteiligen Code erzwingt:

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

... drei Zahlen, eine Periode, drei Zahlen, eine Periode, vier Zahlen.

Muss ich eine CLR-Funktion erstellen, um den Mustervergleich zu erzwingen, und kann auf die CLR-Funktion in DDL verwiesen werden?

Gibt es eine Möglichkeit, das Muster auf andere Weise durchzusetzen LIKE?

mrblint
quelle

Antworten:

16

Der reguläre Ausdruck in Ihrer Frage ist nicht ganz eindeutig

In den meisten Varianten, die Unicode unterstützen, enthält \ d alle Ziffern aller Skripte. Bemerkenswerte Ausnahmen sind Java, JavaScript und PCRE. Diese Unicode-Varianten stimmen nur mit ASCII-Ziffern mit \ d überein.

In vielen Geschmacksrichtungen würde es also übereinstimmen ١١١.١١١.١١١١(dieses Zeichen ist die arabisch-indische Ziffer 1 ).

Ich gehe davon aus, dass Sie nur mit Latein übereinstimmen wollen 0-9. Sie können verwenden

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

Ich verwende die binäre Kollatierungsklausel, damit Zeichenfolgen die Prüfung mögen ¾¾¾.¾¾¾.¾¾¾¾oder 10².10².1000nicht bestehen ( wie dies bei einigen Kollatierungen der Fall sein kann ).

Keines davon würde mit dem gewünschten regulären CLR-Ausdruck übereinstimmen, und obwohl die Verwendung der festgelegten Syntax ( [0123456789]) anstelle der Bereichssyntax ( [0-9]) die erste auflöst, ist die Kollatierung immer noch abhängig, ob sie 2übereinstimmt ²oder nicht.

Ich verwende REPLACEdas LIKEMuster eher, als es hart zu codieren , weil ich es besser lesbar finde, was das Muster überprüft. Es ist einfacher, drei Ziffern und einen Punkt zu sehen, gefolgt von drei Ziffern, einem weiteren Punkt als vier Ziffern in diesem Format als beim Parsen [0-9][0-9][0-9].[0-9] [0-9][0-9].[0-9][0-9][0-9][0-9].

Dies erleichtert auch das Auswechseln der Implementierung.

Wenn Sie sich entscheiden, dass Sie die vollständige Semantik des regulären CLR-Ausdrucks möchten, können Sie schließlich einfach '[0-9]'oben nach unten wechseln (und NCHAR(12)in diesem Fall wahrscheinlich die Spalte in ändern ).

'[' +
 /*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
Martin Smith
quelle