CHECK, contrainte pour appliquer la correspondance de modèle ###. ###. ####


11

Je voudrais avoir une contrainte de vérification qui applique ce modèle d'expression régulière pour un code en plusieurs parties:

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

... trois chiffres, une période, trois chiffres, une période, quatre chiffres.

Dois-je créer une fonction CLR pour appliquer la correspondance de modèle, et la fonction CLR peut-elle être référencée dans DDL?

Existe-t-il un moyen d'appliquer le modèle d'une autre manière, en utilisant LIKE?

Réponses:


16

Le regex dans votre question n'est pas tout à fait sans ambiguïté

Dans la plupart des versions prenant en charge Unicode, \ d inclut tous les chiffres de tous les scripts. Les exceptions notables sont Java, JavaScript et PCRE. Ces saveurs Unicode correspondent uniquement aux chiffres ASCII avec \ d.

Donc, dans de nombreuses saveurs, cela correspondrait ١١١.١١١.١١١١(ce caractère étant le chiffre arabe-indicateur un )

Je suppose que vous voulez juste faire correspondre le latin 0-9. Vous pouvez utiliser

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

J'utilise la clause binaire collate pour que les chaînes aiment ¾¾¾.¾¾¾.¾¾¾¾ou 10².10².1000ne passent pas la vérification ( comme cela peut arriver sur certains classements ).

Aucun de ceux-ci ne correspondrait à l'expression rationnelle CLR souhaitée et bien que l'utilisation de la syntaxe définie ( [0123456789]) plutôt que de la syntaxe de plage ( [0-9]) résout la première, elle dépend toujours du classement, qu'elle 2corresponde ²ou non.

J'utilise REPLACEplutôt que de coder en dur le LIKEmodèle, car je trouve plus lisible ce que le modèle vérifie. Il est plus facile de voir trois chiffres et un point suivi de trois chiffres un autre point puis quatre chiffres dans ce format que l'analyse [0-9][0-9][0-9].[0-9] [0-9][0-9].[0-9][0-9][0-9][0-9].

Cela facilite également l'échange de l'implémentation.

Si vous décidez que vous voulez la sémantique complète de l'expression régulière CLR après tout, vous pouvez simplement passer de '[0-9]'ci-dessus à ci-dessous (et probablement changer la colonne en NCHAR(12)dans ce cas)

'[' +
 /*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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.