Précédent   Forum des professionnels en informatique > Bases de données > MS SQL-Server > Développement
Développement Forum d'entraide sur le Transact-SQL, le CLR, les procédures stockées, les triggers, les requêtes SQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 02/07/2008, 13h59   #1
Membre chevronné
 
Inscription : janvier 2006
Messages : 918
Détails du profil
Informations forums :
Inscription : janvier 2006
Messages : 918
Points : 735
Points : 735
Par défaut Requête LIKE : problème incompréhensible sur [A-Z]

Bonjour

J'ai une table contenant des codes de devises de type AUD, CAD, EUR, USD, ZAR en collation CS_AI
Observez bien le résultats des requêtes suivantes :
select * from table where devise like '[ABC]%' : AUD, CAD
select * from table where devise like '[ACZ]%' : AUD, CAD
select * from table where devise like '[AZC]%' : AUD
select * from table where devise like '[A-Y]%' : AUD, CAD, EUR, USD
select * from table where devise like '[A-Z]%' : rien
select * from table where devise like '[Z]%' : ZAR

mais
select * from table where devise like '[A-Z]%' COLLATE CS_AS : tout

Quelqu'un saurait-il pourquoi le Z pose problème dans la requête en CS_AI ?

Que faire pour résoudre ce problème ?
guidav est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/07/2008, 14h06   #2
Rédacteur/Modérateur

 
Avatar de SQLpro
 
Homme Frédéric BROUARD
Expert SGBDR & SQL
Inscription : mai 2002
Messages : 10 959
Détails du profil
Informations personnelles :
Nom : Homme Frédéric BROUARD
Localisation : France

Informations professionnelles :
Activité : Expert SGBDR & SQL
Secteur : Conseil

Informations forums :
Inscription : mai 2002
Messages : 10 959
Points : 17 792
Points : 17 792
Quelle est la collation de la colonne devise dans la table ?

C'est cela qui te guidera vers la solution.

De plus la collation CS_AS n'existe pas. Il faut la langue !

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 * * * * *
SQLpro est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/07/2008, 14h11   #3
Membre chevronné
 
Inscription : janvier 2006
Messages : 918
Détails du profil
Informations forums :
Inscription : janvier 2006
Messages : 918
Points : 735
Points : 735
Merci de ta réponse, et au temps pour moi, j'ai été un peu rapide dans mon exposé.
La table (et le champ) sont en Latin1_General_CI_AS, et la requête fonctionne si on précise COLLATE Latin1_General_CS_AS

Ce qui me surprend, c'est que la lettre Z n'a pas de raison d'être sensible aux accents, si ?
guidav est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/07/2008, 17h01   #4
Rédacteur/Modérateur

 
Avatar de SQLpro
 
Homme Frédéric BROUARD
Expert SGBDR & SQL
Inscription : mai 2002
Messages : 10 959
Détails du profil
Informations personnelles :
Nom : Homme Frédéric BROUARD
Localisation : France

Informations professionnelles :
Activité : Expert SGBDR & SQL
Secteur : Conseil

Informations forums :
Inscription : mai 2002
Messages : 10 959
Points : 17 792
Points : 17 792
C'est une problématique de classement due à la lange latine dans laquelle les accents n'existent pas....

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 * * * * *
SQLpro est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/07/2008, 17h13   #5
Membre chevronné
 
Inscription : janvier 2006
Messages : 918
Détails du profil
Informations forums :
Inscription : janvier 2006
Messages : 918
Points : 735
Points : 735
D'accord, mais pourquoi cela a-t-il un impact sur ma requête ? Je n'ai pas d'accents dans ma table, ni dans mes critères de requête.
En fait, j'aimerais surtout comprendre pourquoi je n'ai pas de résultat (ou des résultats tronqués) avec

select * from table where devise like '[A-Z]%' : rien
ni avec
select * from table where devise like '[AZC]%' : AUD
alors que j'en ai avec
select * from table where devise like '[A-Y]%' : AUD, CAD, EUR, USD

Se pourrait-il que le Z ait une signification particulière en Latin1_General ?
guidav est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/07/2008, 23h47   #6
Nouveau Membre du Club
 
Inscription : mai 2008
Messages : 32
Détails du profil
Informations forums :
Inscription : mai 2008
Messages : 32
Points : 33
Points : 33
J'ai fais le test suivant en remplaçant XXX successivement par :
Latin1_General_CI_AS
Latin1_General_CS_AS
Latin1_General_CI_AI
Latin1_General_CS_AI

Code :
1
2
3
4
5
6
7
8
9
10
11
12
 
CREATE TABLE t (d CHAR(3) collate XXX)
 
INSERT t (d) VALUES ('AUD')
INSERT t (d) VALUES ('CAD')
INSERT t (d) VALUES ('EUR')
INSERT t (d) VALUES ('USD')
INSERT t (d) VALUES ('ZAR')
 
SELECT * FROM t WHERE d LIKE '[A-Z]%' 
 
DROP TABLE t
A chaque fois, le SELECT me renvoie :

Code :
1
2
3
4
5
AUD
CAD
EUR
USD
ZAR
Donc pour moi, tout fonctionne très bien. Désolé mais je ne vois pas d'où cela peut venir.

________________________________
Seminoque, créateur de
http://www.bingokaz.com
seminoque est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/07/2008, 15h37   #7
Membre chevronné
 
Inscription : janvier 2006
Messages : 918
Détails du profil
Informations forums :
Inscription : janvier 2006
Messages : 918
Points : 735
Points : 735
Merci pour tes tests. Ton code renvoie bien la même chose que pour toi si le champ n'est pas indexé.

Par contre, si le champ devise est indexé (ou clé primaire), mon problème réapparaît, quelque soit la collation du champ (Latin1_General_CS_AI ou Latin1_General_CS_AS), mais ça marche en Latin1_General_BIN.

Le fait d'indexer le champ a-t-il un impact sur la collation (collation implicite, ou un truc dans le genre ?). Ou faut-il définir la collation de l'index en plus de celle du champ ?
guidav est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/07/2008, 15h54   #8
Expert Confirmé
 
Avatar de rudib
 
Inscription : mai 2006
Messages : 2 236
Détails du profil
Informations personnelles :
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : mai 2006
Messages : 2 236
Points : 2 983
Points : 2 983
Envoyer un message via ICQ à rudib Envoyer un message via MSN à rudib
Bonjour,

Intéressant, il ne s'agit pas d'un problème de collation, mais d'un problème de plan d'exécution. Si tu as un index, SQL Server choisit un seek, avec un prédicat étrange : un between A et B ... La raison pour laquelle ça marche sans index ou avec un COLLATE, c'est à cause du scan de la table (le COLLATE force le scan). Je vais investiguer pour voir d'où ça peut venir.
__________________
Rudi Bruchez
Consultant indépendant
modélisation, administration, optimisation, formation,
solutions MS SQL Server et informatique libre.
MCDBA, MCITP, MCT, SCJP2 - http://www.babaluga.com/
Articles et tutoriels : http://rudi.developpez.com/
LIVRE : Optimiser SQL Server
rudib est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/07/2008, 16h39   #9
Expert Confirmé
 
Avatar de rudib
 
Inscription : mai 2006
Messages : 2 236
Détails du profil
Informations personnelles :
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : mai 2006
Messages : 2 236
Points : 2 983
Points : 2 983
Envoyer un message via ICQ à rudib Envoyer un message via MSN à rudib
Le comportement est comme tu le décris en SQL Server 2005 RTM, par contre c'est correct en SP2. As-tu un service pack installé ?
__________________
Rudi Bruchez
Consultant indépendant
modélisation, administration, optimisation, formation,
solutions MS SQL Server et informatique libre.
MCDBA, MCITP, MCT, SCJP2 - http://www.babaluga.com/
Articles et tutoriels : http://rudi.developpez.com/
LIVRE : Optimiser SQL Server
rudib est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/07/2008, 16h46   #10
Membre chevronné
 
Inscription : janvier 2006
Messages : 918
Détails du profil
Informations forums :
Inscription : janvier 2006
Messages : 918
Points : 735
Points : 735
Merci d'avoir cherché, c'est en effet le RTM que nous avons.
Je vais demander l'upgrade à notre admin (et allumer un cierge par la même occasion).
En attendant, la clause '[ABCDE...XYZ]%' pourra toujours servir.
guidav est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 03h47.


 
 
 
 
Partenaires

Hébergement Web