Calade
Messages postés1207Date d'inscriptiondimanche 20 avril 2003StatutMembreDernière intervention 4 juin 2016
-
25 avril 2011 à 12:24
Calade
Messages postés1207Date d'inscriptiondimanche 20 avril 2003StatutMembreDernière intervention 4 juin 2016
-
26 avril 2011 à 08:52
Bonjour,
J'ai un petit problème avec un filtre et l'opérateur LIKE en SQL Server.
Dans mon serveur, j'ai pris pour habitude de TOUJOURS commencer le nom des bases de données par "DB_" en majuscules, et pour les bases de test de les terminer par "_TEST", là aussi en majuscules.
Quand j'utilise la procédure stockée "sp_databases" destinée à me ramener toutes les bases du server, j'intègre celle-ci dans une UDF qui reçoit en paramètres 1 booléen indiquant si je veux recevoir toutes les bases ou seulement les bases persos et un enum indiquant si dans mes bases persos je les veux toutes, uniquement celles de prod' ou uniquement celles de test.
Dans le 1er cas, un filtre comme ceci "DATABASE_NAME LIKE 'DB_%'" marche nickel
Par contre dans le 3ème (les bases de test) le filtre "DATABASE_NAME LIKE 'DB_%_TEST'" ne ramène rien.
cs_Jack
Messages postés14006Date d'inscriptionsamedi 29 décembre 2001StatutModérateurDernière intervention28 août 201579 25 avril 2011 à 19:10
Oui, OR ou AND, mais pas comme tu l'as fait - tu ne peux pas inclure le nom d'un objet dans la syntaxe. Cette formulation devrait mieux passer :
"DATABASE_NAME LIKE 'DB_%' And DATABASE_NAME LIKE '%TEST%'"
Revoir le % final, non nécessaire puisque tu cherches un champ qui se termine par TEST.
Si tu utilises ADO (ADODB), pourquoi ne pas faire une requète SQL simple ?
Avec DAO, les méthodes de recherche et de filtre n'étaient pas très fonctionnelles. ADO fonctionne t-il mieux. Apparemment non.
Tu fais ta connextion à ta DB, tu déclares ton RecordSet et tu fais
monRecordSet.Open maRequeteSQL, maConnexion, adOpenStatic, adLockReadOnly
Tu n'as plus qu'à lire le contenu du RecordSet par une boucle Do-Loop que tu trouveras dans toute bonne source parlant de ADODB.
Et là, je te garantis que cela fonctionne.
Vala
Jack, MVP VB NB : Je ne répondrai pas aux messages privés
Le savoir est la seule matière qui s'accroit quand on la partage (Socrate)
cs_Jack
Messages postés14006Date d'inscriptionsamedi 29 décembre 2001StatutModérateurDernière intervention28 août 201579 25 avril 2011 à 12:42
Salut
Les caractères - _ [ ] posent problèmes dans les Like puisqu'ils servent de balises syntaxiques.
Dans ce cas, il faut encadrer le caractère par des crochets [ et ]
Exemple :
Like 'DB[_]%'
Like '%mon [[]mots entre crochets []]%'
Vala
Jack, MVP VB NB : Je ne répondrai pas aux messages privés
Le savoir est la seule matière qui s'accroit quand on la partage (Socrate) [img]http://allproj
Calade
Messages postés1207Date d'inscriptiondimanche 20 avril 2003StatutMembreDernière intervention 4 juin 201610 25 avril 2011 à 12:55
Salut Jack,
et merci pour ta réponse.
En ce qui concerne le "%", je n'en ai pas dans mes noms de base (j'ai vérifié).
En fonction de ce que tu m'as dit, j'ai fait des essais:
"DATABASE_NAME LIKE 'DB%'" me renvoie toutes mes bases persos, OK
"DATABASE_NAME LIKE 'DB%TEST'" me renvoie la même chose ce qui n'est pas ce que je veux.
"DATABASE_NAME LIKE 'DB[_]%'"
"DATABASE_NAME LIKE 'DB[^_]%'"
"DATABASE_NAME LIKE 'DB[_]%[_]TEST'"
"DATABASE_NAME LIKE 'DB[^_]%[^__]TEST'" me renvoient tous les 4 un recordset filtré vide!
Calade
Vous n’avez pas trouvé la réponse que vous recherchez ?
cs_Jack
Messages postés14006Date d'inscriptionsamedi 29 décembre 2001StatutModérateurDernière intervention28 août 201579 25 avril 2011 à 14:13
Est-ce que tu as essayé ces syntaxes directement dans le Manager de SQL Server ?
Ça peut être intéressant car en remplissant la grille de contrainte, tu peux récupérer le code SQL qui en découle.
Calade
Messages postés1207Date d'inscriptiondimanche 20 avril 2003StatutMembreDernière intervention 4 juin 201610 25 avril 2011 à 14:23
Je me demande si tu n'as pas mis le doigt dessus.
Le test avec LIKE N'DB[_]%[_]TEST' renvoie une erreur de type "Type Incorrect" ou "en dehors des limites".
Dans mon 1er post j'ai précisé mais sans insister que c'était sur un filtre appliqué sur le recordset issu de sp_databases et non sur une requête classique.
Est-ce que cela ne viendrait pas de là par hasard.
Je n'ai pas essayé avec une requête classique car j'aurais préféré utilisé la procédure fourni pour des éventuels problèmes de compatibilité ultérieure. Mais si j'y suis obligé...
cs_Jack
Messages postés14006Date d'inscriptionsamedi 29 décembre 2001StatutModérateurDernière intervention28 août 201579 25 avril 2011 à 14:41
Oublie le N s'il pose problème.
Rappel : Avec Like, les minuscules/majuscules ont leur importance : tes noms de tables sont-elles toutes en maj ?
Tu dois pouvoir utiliser les LCASE ou UCASE à l'intérieur des requètes.
Calade
Messages postés1207Date d'inscriptiondimanche 20 avril 2003StatutMembreDernière intervention 4 juin 201610 25 avril 2011 à 14:45
Les caractères importants (DB et TEST) sont systématiquement en majuscules pour des raisons de lisibilité. J'ai mis le nom des bases plus haut exactement comme elles sont inscrites dans la base "master".
Et comme il s'agit d'un filtre je ne peux pas mettre de fonctions colle LEFT() ou UCASE()). Ce serait trop beau !
Calade
Messages postés1207Date d'inscriptiondimanche 20 avril 2003StatutMembreDernière intervention 4 juin 201610 25 avril 2011 à 15:13
J'ai fait d'autres essais mais le moins que l'on puisse dire c'est que ce n'est pas concluant.
SQL_GetDataBases.Filter LIKE "DB_%" =>OK, j'ai toutes mes bases
SQL_GetDataBases.Filter "DATABASE_NAME LIKE 'DB_%' AND SQL_GetDataBases.Filter "DATABASE_NAME LIKE '%TEST%'" => Erreur "Type incorrect ou en dehors de limites autorisées".
SQL_GetDataBases.Filter "DATABASE_NAME LIKE 'DB_%'" And "SQL_GetDataBases.Filter "DATABASE_NAME LIKE '%TEST%'" Erreur => "Type incorrect ou en dehors de limites autorisées."
Alors que j'ai vu dans la doc' ADO et sur le site du Guru que l'on pouvait mettre des OR ou des AND.
Par contre:
SQL_GetDataBases.Filter "DATABASE_NAME LIKE '%TEST'"> même erreur,
mais
SQL_GetDataBases.Filter = "DATABASE_NAME LIKE '%TEST%'" me renvoie mes 2 seules bases de Test.
Calade
Messages postés1207Date d'inscriptiondimanche 20 avril 2003StatutMembreDernière intervention 4 juin 201610 26 avril 2011 à 08:52
Salut Jack et merci,
Ton dernier post marche
"DATABASE_NAME LIKE 'DB_%' And DATABASE_NAME LIKE '%TEST%'"
posé sur le filtre du recordset.
En fait je n'utilise pas, pour des raisons de compatibilité ultérieure une requête du type SELECT ou pour le coup les LEFT() et consorts auraient fonctionné.
J'utilise un objet ADODB.Command avec la procédure stocké système "sp_databases". Celui-ci me renvoie un recordset sur lequel j'essayais vainement d'appliquer un filtre.