2012-08-13 3 views
3

im essayant de rejeter toutes les entrées non dans le format « 03 xxxx xxxx » donc je créé une table commecontrainte Regex CHECK ne fonctionne pas avec le serveur SQL

create table records 
(
.... 
num varchar(255) NOT NULL, 
... 
CONSTRAINT num_check CHECK (num like '03 [0-9]{4} [0-9]{4}') 
) 

qui devrait (je pense?) Accepter par exemple " 03 1234 1234 ". mais si je tente d'ajouter ce via le gestionnaire sql je reçois une erreur avec le message: « l'instruction INSERT en conflit avec la contrainte CHECK « num_check » »

au début, je pensais que mon Regex était hors mais Ive a essayé dans un quelques autres endroits et il accepte l'exemple ci-dessus. des idées?

+1

En ce qui concerne Je sais que vous ne pouvez pas implémenter Regex dans SQL Server sans utiliser un Assemblage CLR. Il n'a pas de support Regex natif comme le fait Oracle ... à moins que ma mémoire ne me manque. – scarpacci

+0

Je suivais quelque chose que j'ai vu ici. http://www.dbforums.com/microsoft-sql-server/714703-check-constraint-regular-expressions.html – TrewTzu

+0

Jusqu'ici, j'ai seulement trouvé un DBE qui supporte les contraintes posix regex et c'est Oracle (Référence: http://stackoverflow.com/questions/35157662/is-there-a-database-engine-that-allows-for-queriable-field-constraint-specified). MS SQL et DB2 ont l'air d'avoir leur propre variante générique, ce qui est regrettable car vous perdez la cohérence des contraintes entre les couches :( –

Répondre

7

like ne fonctionne pas avec des expressions régulières, il a ses propres motifs, génériques beaucoup plus simples, qui ne supportent que %, _, [a-z] et [^a-z]. C'est tout. {4} ne fonctionnerait pas, tout comme la plupart des fonctionnalités regex.
Vous devriez pouvoir utiliser:

like '03 [0-9][0-9][0-9][0-9] [0-9][0-9][0-9][0-9]' 

Une autre option, un peu moins répétitif:

declare @digitChar nvarchar(12) 
set @digitChar = '[0-9]' 

clause Where:

like '03 ' + replicate(@digitChar,4) + ' ' + replicate(@digitChar,4) 

Exemple: http://sqlfiddle.com/#!3/d41d8/3251

+0

ça va m'apprendre à essayer de rendre mon Regex plus propre et plus court Merci Kobi – TrewTzu

+1

@TrewTzu - C'est exactement le problème - 'like' ne gère pas les expressions régulières - c'est juste le' [] 'qui est similaire.En tout cas, j'ai inclus une autre version - j'ai fait quelque chose de très similaire en vérifiant les GUID, et je ne voulais pas -9a-fA-F] 'répété 32 fois ... – Kobi