Recherche générique en SQL Server

Résolu
Calade Messages postés 1207 Date d'inscription dimanche 20 avril 2003 Statut Membre Dernière intervention 4 juin 2016 - 25 avril 2011 à 12:24
Calade Messages postés 1207 Date d'inscription dimanche 20 avril 2003 Statut Membre Derniè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.

Quelqu'un pourrait-il me dire où est l'erreur ?

Merci d'avance.


Calade

16 réponses

cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
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)
3
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
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
0
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
25 avril 2011 à 12:43
J'oubliais aussi le %, si tu as ce symbole dans ton champ
0
Calade Messages postés 1207 Date d'inscription dimanche 20 avril 2003 Statut Membre Dernière intervention 4 juin 2016 10
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
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
25 avril 2011 à 13:36
On n'a pas d'exemple de résultat recherché : Donne nous des exemples de noms à retrouver.

Si ta donnée commence par DB_TEST :
Like 'DB[_]TEST%'

LIKE 'DB[_]%[_]TEST' veut dire que ton champ doit commencer par DB_ et se finir par _TEST, par exemple
DB_4012_TEST, DB__TEST, DB_A_TEST, etc

Le symbole ^ est là pour exclure le symbole/combinaison qui suit, à l'intérieur de tes crochets.
0
Calade Messages postés 1207 Date d'inscription dimanche 20 avril 2003 Statut Membre Dernière intervention 4 juin 2016 10
25 avril 2011 à 13:48
Entre autre j'ai les bases suivantes

DB_Movies
DB_Movies_TEST
DB_Books
DB_Books_TEST

et aucune ne commence par DB_TEST
ce que je comprends pas c'est que
LIKE 'DB[_]%[_]TEST' ne renvoie rien
LIKE 'DB[_]%' ne renvoie rien

alors que LIKE 'DB_%' renvoie DB_Movies et DB_Books, ça ne parait pas logique par rapport à ce que tu dis et à la doc' SQL.

Calade
0
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
25 avril 2011 à 14:10
Étrange.
Puisque tu es sur SQL Server, tente cette syntaxe :
LIKE N'DB[_]%[_]TEST'
Le N est là pour des histoires de chaines Unicode

LIKE 'DB_%' te renvoie DB_Movies et DB_Books, mais devrait aussi renvoyer DB_Movies_TEST et DB_Books_TEST.
0
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
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.
0
Calade Messages postés 1207 Date d'inscription dimanche 20 avril 2003 Statut Membre Dernière intervention 4 juin 2016 10
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é...


Calade
0
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
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.
0
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
25 avril 2011 à 14:44
Ah mais attend : Le Like dont tu parles, c'est un Like VB6 ou SQL ?
Ça changerait tout, les balises ne sont pas les mêmes.
0
Calade Messages postés 1207 Date d'inscription dimanche 20 avril 2003 Statut Membre Dernière intervention 4 juin 2016 10
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
0
Calade Messages postés 1207 Date d'inscription dimanche 20 avril 2003 Statut Membre Dernière intervention 4 juin 2016 10
25 avril 2011 à 14:49
C'est un LIKE SQL inclus dans la chaîne de filtrage:

MyRecordset.FILTER = "DATABASE_NAME LIKE 'DB_'"


Calade
0
Calade Messages postés 1207 Date d'inscription dimanche 20 avril 2003 Statut Membre Dernière intervention 4 juin 2016 10
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.

Curieux n'est-il pas ?

Calade
0
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
25 avril 2011 à 19:11
En retour, informe nous des types d'objets que tu utilisent.
0
Calade Messages postés 1207 Date d'inscription dimanche 20 avril 2003 Statut Membre Dernière intervention 4 juin 2016 10
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.

Maintenant tout roule.

Merci encore pour tout.


Calade
0
Rejoignez-nous