|
Publicité ' | |||||||||||||||||||||||
|
|
#1 |
![]() ![]() Yves Développeur informatique Inscription : janvier 2007 Messages : 3 878 ![]() |
Salut à tous, j'ai un petit soucis avec un filtre where.
Le contexte : Je fais une reprise de données sur une vieille appli dont les bases sont sous SQLServer. Dans la nouvelle structure, j'ai un champ d'une table qui ne peut contenir que des caractères autorisés à savoir Alphanumérique sans accent, les /-%+$. et l'espace. Certaines données actuelles contiennent des caractères donc interdits. Je veux faire une requête pour sortir les enregistrements dont le champs contient ces caractères interdits, pour pouvoir mettre quelqu'un dessus ensuite pour corriger ces données afin de ne pas bloquer la récupération (il est probable qu'il ne soit pas possible de faire une correction aveugle par une fonction Replace). N'ayant pas envie de me taper une série de Like dans le Where, je me dis qu'une RegEx doit être capable de faire ça. Donc récupérer, les enregistrements dont le champs contient un ou plusieurs caractères autres que ceux autorisés. Il faudrait apparemment que j'utilise une fonction xp_regex_format, c'est bien ça ? Par contre, je suis bien incapable d'écrire la RegEx elle-même. Un peu d'aide ? PS : base de prod sous SQLServer2000 Possibilité de travailler sur une copie de test sous SQLServer 208 Express, si besoin.
__________________
Sevyc64 --- Le partage est notre force NON AU LANGAGE SMS & FAUTES VOLONTAIRES SUR LES FORUMS |
|
|
00
|
|
|
#2 |
|
Membre Expert
![]() ![]() Inscription : janvier 2010 Messages : 1 084 ![]() |
Bonjour
Vous devriez pouvoir vous en sortir avec un Pouvez vous nous fournir un jeu d'essai, avec 5 ou 6 valeurs valides, et 5 ou 6 valeurs invalides (+ raison de l'invalidité) |
|
|
00
|
|
|
#3 | |||
|
Membre Expert
![]() ![]() Inscription : janvier 2010 Messages : 1 084 ![]() |
Citation:
que donne cette requête (elle devrait vous sortir les valeurs invalides) : Code SQL :
|
|||
|
|
00
|
|
|
#4 | ||
![]() ![]() Yves Développeur informatique Inscription : janvier 2007 Messages : 3 878 ![]() |
Ok, apparemment on a pas besoin de fonctions particulières pour utiliser une RegEx dans avec LIKE. Déjà, j'ai appris ça.
Pour la contrainte sur la base, sur la base source, il n'y en a pas, sinon ça n'aurait pas pu être saisi. Pour la base de destination, je ne sais pas, je n'y ai pas accès. C'est une base propriétaire, l'import se fait par l'application propriétaire (SAGE L100) via fichiers textes (que je dois générer moi) et c'est l'application qui indique elle-même les erreurs. Ensuite ta regex n'est pas bonne. Elle me renvoie des champs qui sont corrects. par exemple, elle me renvoie ceci : Code :
__________________
Sevyc64 --- Le partage est notre force NON AU LANGAGE SMS & FAUTES VOLONTAIRES SUR LES FORUMS |
||
|
|
00
|
|
|
#5 | |
![]() ![]() Yves Développeur informatique Inscription : janvier 2007 Messages : 3 878 ![]() |
Pour un premier passage de fichier, j'ai repéré les caractères suivants qui ne seraient pas bons :
Citation:
__________________
Sevyc64 --- Le partage est notre force NON AU LANGAGE SMS & FAUTES VOLONTAIRES SUR LES FORUMS |
|
|
|
00
|
|
|
#6 | ||||
![]() ![]() ![]() Frédéric BROUARDExpert SGBDR & SQL Inscription : mai 2002 Messages : 10 954 ![]() |
REGEX est non seulement contre performant, mais sujet à des attaques de DOS.
Voici une solution avec like : Code :
Code :
__________________
Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL Site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/ Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp. Blog SQL, SQL Server, modélisation données : http://blog.developpez.com/sqlpro http://www.sqlspot.com : modélisation, conseils, audit, optimisation, formation * * * * * Enseignant CNAM PACA - ISEN Toulon - CESI Aix en Provence * * * * * |
||||
|
00
|
|
|
#7 | ||
|
Membre Expert
![]() ![]() Inscription : janvier 2010 Messages : 1 084 ![]() |
oui, en effet, je n'ai pas fait attention au "-" dans la liste des caractères spéciaux acceptés. le tiret sert a définir des plages, il faut donc le déspécialiser dans la requête que j'ai donnée :
Code SQL :
|
||
|
|
00
|
|
|
#8 |
![]() ![]() Yves Développeur informatique Inscription : janvier 2007 Messages : 3 878 ![]() |
aieeeuuuuu >
Ta requête corrigée semble me renvoyer effectivement que des enregistrements qui ont un caractère pas bon. (j'ai pas tout analyser dans le détail) SQLpro > Ta requête semble faire l'inverse (des résultats que j'ai, et de ce que j'en comprend), elle ne renvoie que les enregistrements qui sont bons. Hors moi, c'est ceux qui sont mauvais qu'il me faut. Problème : J'ai un total de 8067 lignes dans la table la requête de aieeeuuuuu me renvoie 61 lignes la requête de SQLpro me renvoie 7172 lignes, laissant supposer 895 lignes incorrectes. Il faut donc que je recherche ce qui fait cet écart entre 61 et 895 !
__________________
Sevyc64 --- Le partage est notre force NON AU LANGAGE SMS & FAUTES VOLONTAIRES SUR LES FORUMS |
|
|
00
|
|
|
#9 |
![]() ![]() ![]() Frédéric BROUARDExpert SGBDR & SQL Inscription : mai 2002 Messages : 10 954 ![]() |
NOT LIKE !
Faudrait quand même investir un peu de jus de cerveau pour apprendre le minimum en matière de SQL !!!!! A +
__________________
Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL Site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/ Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp. Blog SQL, SQL Server, modélisation données : http://blog.developpez.com/sqlpro http://www.sqlspot.com : modélisation, conseils, audit, optimisation, formation * * * * * Enseignant CNAM PACA - ISEN Toulon - CESI Aix en Provence * * * * * |
|
00
|
|
|
#10 |
![]() ![]() Yves Développeur informatique Inscription : janvier 2007 Messages : 3 878 ![]() |
![]() ![]() ![]() Bien sur que j'avais tenté NOT LIKE, sauf que ça me renvoie 157 lignes, d’où investigations. Pour les lignes manquantes, c'est à dire 738, c'est tout simplement que le champs en question est à Null, ce qui est pas mal, pour une référence censée être obligatoire. De plus ça me permet de m’apercevoir, que ce champs a été renseigné n'importe comment. Ce qui est censé contenir une référence, contient parfois un commentaire, une adresse mail, ou autres bizarreries.
__________________
Sevyc64 --- Le partage est notre force NON AU LANGAGE SMS & FAUTES VOLONTAIRES SUR LES FORUMS |
|
|
00
|
|
|
#11 | ||
|
Membre Expert
![]() ![]() Inscription : janvier 2010 Messages : 1 084 ![]() |
Citation:
Vous devez avoir des NULL Citation:
|
||
|
|
00
|
|
|
#12 |
|
Membre Expert
![]() ![]() Inscription : janvier 2010 Messages : 1 084 ![]() |
notez également la légère différence entre le Pattern de SQLPro et le mien :
Mon pattern considérera 3 caractères invalides que le pattern de SQLPro considérera comme valides : ¹ ² ³ (exposant 1, 2 et 3) C'est très mineur, et à part cela, je ne vois pas de différence sémantique. |
|
|
00
|
|
|
#13 |
![]() ![]() Yves Développeur informatique Inscription : janvier 2007 Messages : 3 878 ![]() |
Oui aieeeuuuuu, ton pattern considère les accents comme valide, mais ils sont invalides, d’où la différence entre 61 lignes invalide avec ton pattern et 157 avec celui de SQLPro
__________________
Sevyc64 --- Le partage est notre force NON AU LANGAGE SMS & FAUTES VOLONTAIRES SUR LES FORUMS |
|
|
00
|
|
|
#14 |
|
Membre Expert
![]() ![]() Inscription : janvier 2010 Messages : 1 084 ![]() |
|
|
|
00
|
|
|
#15 | ||
![]() ![]() ![]() Frédéric BROUARDExpert SGBDR & SQL Inscription : mai 2002 Messages : 10 954 ![]() |
Ma requête est d'ailleurs erronée. Voici une correction :
Code :
__________________
Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL Site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/ Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp. Blog SQL, SQL Server, modélisation données : http://blog.developpez.com/sqlpro http://www.sqlspot.com : modélisation, conseils, audit, optimisation, formation * * * * * Enseignant CNAM PACA - ISEN Toulon - CESI Aix en Provence * * * * * |
||
|
00
|
|
|
#16 | |
![]() ![]() Yves Développeur informatique Inscription : janvier 2007 Messages : 3 878 ![]() |
Citation:
mauvais copier/coller (comme toujours) le COLLATE avait sauté Les 2 requêtes renvoient bien le même résultat, 157 lignes à reprendre. (en réalité c'est presque toute la base qu'il faudrait reprendre, mais ça c'est pas mon boulot) SQLpro> ta correction ne change rien dans ce cas particulier mais aurait pu effectivement. Merci, à vous 2
__________________
Sevyc64 --- Le partage est notre force NON AU LANGAGE SMS & FAUTES VOLONTAIRES SUR LES FORUMS |
|
|
|
00
|
|
|
#17 |
|
Membre Expert
![]() ![]() Inscription : janvier 2010 Messages : 1 084 ![]() |
|
|
|
00
|
Copyright © 2000-2012 - www.developpez.com