Comment puis-je trouver des valeurs de colonne en majuscule? Comme LastName = 'SMITH'
au lieu de 'Smith'
Voici ce que j'essayais ...
SELECT *
FROM MyTable
WHERE FirstName = UPPER(FirstName)
Vous pouvez forcer le classement sensible à la casse;
select * from T
where fld = upper(fld) collate SQL_Latin1_General_CP1_CS_AS
Essayer
SELECT *
FROM MyTable
WHERE FirstName = UPPER(FirstName) COLLATE SQL_Latin1_General_CP1_CS_AS
Ce classement permet des comparaisons sensibles à la casse.
Si vous souhaitez modifier le classement de votre base de données afin de ne pas spécifier de classement respectant la casse dans vos requêtes, vous devez procéder comme suit ( à partir de MSDN ):
1) Assurez-vous de disposer de toutes les informations ou scripts nécessaires pour recréer vos bases de données utilisateur et tous les objets qu’elles contiennent.
2) Exportez toutes vos données en utilisant un outil tel que l'utilitaire bcp.
3) Supprimez toutes les bases de données utilisateur.
4) Reconstruisez la base de données master en spécifiant le nouveau classement dans la propriété SQLCOLLATION de la commande setup. Par exemple:
Setup /QUIET /ACTION=REBUILDDATABASE /INSTANCENAME=InstanceName
/SQLSYSADMINACCOUNTS=accounts /[ SAPWD= StrongPassword ]
/SQLCOLLATION=CollationName
5) Créez toutes les bases de données et tous les objets qu’elles contiennent.
6) Importez toutes vos données.
Vous devez utiliser un classement de serveur sensible à la casse, comme suit:
SELECT *
FROM MyTable
WHERE FirstName = UPPER(FirstName) Collate SQL_Latin1_General_CP1_CS_AS
Soyez par défaut, les comparaisons SQL sont insensibles à la casse.
Essayer
SELECT *
FROM MyTable
WHERE FirstName = LOWER(FirstName)
J'ai créé une simple UDF
pour cela:
create function dbo.fnIsStringAllUppercase(@input nvarchar(max)) returns bit
as
begin
if (ISNUMERIC(@input) = 0 AND RTRIM(LTRIM(@input)) > '' AND @input = UPPER(@input COLLATE Latin1_General_CS_AS))
return 1;
return 0;
end
Ensuite, vous pouvez facilement l’utiliser sur n’importe quelle colonne de la clause WHERE
.
Pour utiliser l'exemple OP:
SELECT *
FROM MyTable
WHERE dbo.fnIsStringAllUppercase(FirstName) = 1
Pourriez-vous essayer de l'utiliser comme clause Where?
WHERE PATINDEX(FirstName + '%',UPPER(FirstName)) = 1
Regardez ici
On dirait que vous avez quelques options
jette la chaîne en VARBINARY (longueur)
utiliser COLLATE pour spécifier un classement sensible à la casse
calculer le BINARY_CHECKSUM () des chaînes à comparer
changez la propriété COLLATION de la colonne de la table
utiliser des colonnes calculées (calcul implicite de VARBINARY)
Vous pouvez trouver un bon exemple dans Recherche sensible à la casse: Récupération de chaînes minuscules ou majuscules sur SQL Server
Essaye ça
SELECT *
FROM MyTable
WHERE UPPER(FirstName) COLLATE Latin1_General_CS_AS = FirstName COLLATE Latin1_General_CS_AS