Comment sélectionner les lignes contenant uniquement des caractères en majuscules ? Il y a 3 méthodes pour y arriver :
- Comparer avec BINARY_CHECKSUM
- Utiliser COLLATE
- « Caster » le champ en varbinary
Afin de faire nos tests, nous allons créer une table temporaire et y ajouter des données
CREATE TABLE #tmp_exemple ( MonChamp VARCHAR(10) NOT NULL )
INSERT INTO #tmp_exemple
SELECT 'Mot'
UNION ALL
SELECT 'MOT'
UNION ALL
SELECT 'Azerty'
UNION ALL
SELECT 'AZERTY'
UNION ALL
SELECT 'QueRTY'
UNION ALL
SELECT 'QUERTY'
UNION ALL
SELECT 'mot'
La requête devra nous retourner les 3 champs suivants
MOT
AZERTY
QUERTY
Première méthode : BINARY_CHECKSUM
SELECT MonChamp FROM #tmp_exemple WHERE BINARY_CHECKSUM(MonChamp) = BINARY_CHECKSUM(UPPER(MonChamp))
Seconde méthode : COLLATE
SELECT MonChamp
FROM #tmp_exemple
WHERE x = UPPER(MonChamp) COLLATE SQL_Latin1_General_CP1_CS_AS
Troisième méthode : Cast to varbinary
SELECT MonChamp
FROM #tmp_exemple
WHERE CAST(MonChamp AS VARBINARY(10)) = CAST(UPPER(MonChamp) AS VARBINARY(10))
Bien sur, si votre base de données en déjà en mode « sensible à la casse », vous avez juste à exécuter la requête suivante
SELECT MonChamp
FROM #tmp_exemple
WHERE UPPER(MonChamp) = MonChamp
Comment connaitre le mode de votre base de données ?, pour cela, vous pouvez utiliser la fonction : DATABASEPROPERTYEX.
SELECT DATABASEPROPERTYEX( '<BASE DE DONNEES>' , 'collation' )
On obtient, par exemple, le résultat suivant : French_CI_AS Pour connaitre la siginifaction de cette « collation », on exécute la requête suivante :
SELECT * FROM ::fn_helpcollations () WHERE NAME ='SQL_Latin1_General_CP1_CI_AS'
La colonne Description nous donne les informations suivantes : French, case-insensitive, accent-sensitive, kanatype-insensitive, width-insensitive
Plus d’information sur les collations SQL Server à cette adresse : http://msdn2.microsoft.com/en-us/library/aa176552(SQL.80).asp
Pas de commentaire reçu(s)
Laisser une réponse