Recherche générique en SQL Server [Résolu]

Calade 1212 Messages postés dimanche 20 avril 2003Date d'inscription 4 juin 2016 Dernière intervention - 25 avril 2011 à 12:24 - Dernière réponse : Calade 1212 Messages postés dimanche 20 avril 2003Date d'inscription 4 juin 2016 Dernière intervention
- 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
Afficher la suite 

Votre réponse

16 réponses

cs_Jack 14010 Messages postés samedi 29 décembre 2001Date d'inscription 28 août 2015 Dernière intervention - 25 avril 2011 à 19:10
+3
Utile
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)
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de cs_Jack
cs_Jack 14010 Messages postés samedi 29 décembre 2001Date d'inscription 28 août 2015 Dernière intervention - 25 avril 2011 à 12:42
0
Utile
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
Commenter la réponse de cs_Jack
cs_Jack 14010 Messages postés samedi 29 décembre 2001Date d'inscription 28 août 2015 Dernière intervention - 25 avril 2011 à 12:43
0
Utile
J'oubliais aussi le %, si tu as ce symbole dans ton champ
Commenter la réponse de cs_Jack
Calade 1212 Messages postés dimanche 20 avril 2003Date d'inscription 4 juin 2016 Dernière intervention - 25 avril 2011 à 12:55
0
Utile
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
Commenter la réponse de Calade
cs_Jack 14010 Messages postés samedi 29 décembre 2001Date d'inscription 28 août 2015 Dernière intervention - 25 avril 2011 à 13:36
0
Utile
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.
Commenter la réponse de cs_Jack
Calade 1212 Messages postés dimanche 20 avril 2003Date d'inscription 4 juin 2016 Dernière intervention - 25 avril 2011 à 13:48
0
Utile
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
Commenter la réponse de Calade
cs_Jack 14010 Messages postés samedi 29 décembre 2001Date d'inscription 28 août 2015 Dernière intervention - 25 avril 2011 à 14:10
0
Utile
É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.
Commenter la réponse de cs_Jack
cs_Jack 14010 Messages postés samedi 29 décembre 2001Date d'inscription 28 août 2015 Dernière intervention - 25 avril 2011 à 14:13
0
Utile
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.
Commenter la réponse de cs_Jack
Calade 1212 Messages postés dimanche 20 avril 2003Date d'inscription 4 juin 2016 Dernière intervention - 25 avril 2011 à 14:23
0
Utile
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
Commenter la réponse de Calade
cs_Jack 14010 Messages postés samedi 29 décembre 2001Date d'inscription 28 août 2015 Dernière intervention - 25 avril 2011 à 14:41
0
Utile
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.
Commenter la réponse de cs_Jack
cs_Jack 14010 Messages postés samedi 29 décembre 2001Date d'inscription 28 août 2015 Dernière intervention - 25 avril 2011 à 14:44
0
Utile
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.
Commenter la réponse de cs_Jack
Calade 1212 Messages postés dimanche 20 avril 2003Date d'inscription 4 juin 2016 Dernière intervention - 25 avril 2011 à 14:45
0
Utile
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
Commenter la réponse de Calade
Calade 1212 Messages postés dimanche 20 avril 2003Date d'inscription 4 juin 2016 Dernière intervention - 25 avril 2011 à 14:49
0
Utile
C'est un LIKE SQL inclus dans la chaîne de filtrage:

MyRecordset.FILTER = "DATABASE_NAME LIKE 'DB_'"


Calade
Commenter la réponse de Calade
Calade 1212 Messages postés dimanche 20 avril 2003Date d'inscription 4 juin 2016 Dernière intervention - 25 avril 2011 à 15:13
0
Utile
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
Commenter la réponse de Calade
cs_Jack 14010 Messages postés samedi 29 décembre 2001Date d'inscription 28 août 2015 Dernière intervention - 25 avril 2011 à 19:11
0
Utile
En retour, informe nous des types d'objets que tu utilisent.
Commenter la réponse de cs_Jack
Calade 1212 Messages postés dimanche 20 avril 2003Date d'inscription 4 juin 2016 Dernière intervention - 26 avril 2011 à 08:52
0
Utile
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
Commenter la réponse de Calade

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.