2008-11-20 4 views
7

Je voudrais trouver toutes les lignes d'une table et faire correspondre une chaîne sensible à la casse. Malheureusement, ma table a la collation insensible à la casse.Comment effectuer une correspondance de chaîne exacte sur un champ non sensible à la casse?

Quelle est la manière la plus efficace d'effectuer cela.

Par exemple.

je voudrais ce qui suit pour retourner aucune ligne:

select * from sysobject where name = 'Sysbinobjs' 

Pour la réponse suppose @match est dans une variable:

declare @match varchar(4000) 
set @match = 'sysbinobjs' 

EDIT

clarification, assurez-vous les espaces de fin sont traités correctement, je veux une correspondance exacte qui tienne compte des espaces de fin pour que 'Hello' ne soit associé qu'à 'Hello' et pas avec 'Bonjour'

Répondre

7

Voici un extrait de code qui fonctionne, c'est vraiment compliqué de le faire d'une manière sûre et efficace. Le double match consiste à éviter un scan de table (regardez le plan d'exécution). Le casting varbinary force une longueur et une correspondance de casse. Ainsi, les espaces de fin sont traités correctement et le boîtier est traité correctement.

Remarque du type étant des besoins par rapport à être identique au type dans la table pour la coulée varbinary au travail (par exemple. Nom SYSOBJECT est un nvarchar de sorte que le @match devra être un nvarchar).

declare @match nvarchar(4000) 
set @match = 'sysbinobjs' 


select * from sysobjects 
where name = @match and 
cast(name as varbinary(4000)) = cast(@match as varbinary(4000)) 
5

En fait, je ne vois pas pourquoi vous devez faire l'échappement d'abord, cela est construit dans le serveur SQL à travers le statment COLLATE.

select * from sysobjects 
WHERE name = @match and --Get all relevant hits from the index before doing the final case sensitive test 
name COLLATE Latin1_General_CS_AS = @match COLLATE Latin1_General_CS_AS 
+0

J'ai simplifié ma réponse, le problème avec celui-ci est que les espaces de fin ne sont pas traités correctement, par exemple. 'bonjour' = 'bonjour', aussi je pense que l'assemblage est difficile à retenir lors du codage. –

+0

+1 Vous êtes un génie mon ami, cette solution a bien fonctionné pour moi !! –

Questions connexes