Question

Pour effectuer une recherche / un remplacement sensible à la casse sur une table d'une base de données SQL Server 2000/2005, vous devez utiliser le classement correct.

Comment déterminez-vous si le classement par défaut d'une base de données est sensible à la casse et, dans le cas contraire, comment effectuer une recherche / remplacement sensible à la casse?

Était-ce utile?

La solution

SELECT testColumn FROM testTable  
    WHERE testColumn COLLATE Latin1_General_CS_AS = 'example' 

SELECT testColumn FROM testTable
    WHERE testColumn COLLATE Latin1_General_CS_AS = 'EXAMPLE' 

SELECT testColumn FROM testTable 
    WHERE testColumn COLLATE Latin1_General_CS_AS = 'eXaMpLe' 

Ne supposez pas que le classement par défaut sera sensible à la casse, mais spécifiez-en un à chaque fois (en utilisant celui qui convient dans votre langue bien sûr)

Autres conseils

Déterminez si le classement par défaut est sensible à la casse, comme suit:

select charindex ('RESULT', 'Si le résultat est 0, vous êtes en mode de classement sensible à la casse')

Un résultat de 0 indique que vous êtes dans un mode de classement sensible à la casse, 8 indique qu'il ne respecte pas la casse.

Si le classement ne respecte pas la casse, vous devez déclarer explicitement le mode de classement que vous souhaitez utiliser lors d'une recherche / remplacement.

Voici comment créer une instruction UPDATE pour effectuer une recherche / remplacement sensible à la casse en spécifiant le mode de classement à utiliser:

update ContentTable
set ContentValue = replace(ContentValue COLLATE Latin1_General_BIN, 'THECONTENT', 'TheContent')
from StringResource
where charindex('THECONTENT', ContentValue COLLATE Latin1_General_BIN) > 0

Ceci correspondra et remplacera 'THECONTENT' , mais pas 'LeContenu' ou 'thecontent' .

Si vous avez différents cas du même mot dans le même champ et souhaitez uniquement remplacer des cas spécifiques , vous pouvez utiliser classement dans votre fonction REPLACE :

UPDATE tableName
SET fieldName = 
    REPLACE(
        REPLACE(
            fieldName COLLATE Latin1_General_CS_AS,
            'camelCase' COLLATE Latin1_General_CS_AS,
            'changedWord'
        ),
        'CamelCase' COLLATE Latin1_General_CS_AS,
        'ChangedWord'
    )

Cela se traduira par:

This is camelCase 1 and this is CamelCase 2

devenir:

This is changedWord 1 and this is ChangedWord 2

Peut être fait en plusieurs déclarations. Cela ne fonctionnera pas si vous avez de longues chaînes contenant à la fois des mots en minuscule et en majuscule que vous souhaitez remplacer. Vous devrez peut-être également utiliser un autre classement qui est sensible à l’accent et à la casse.

UPDATE T SET [String] = ReplacedString
FROM [dbo].[TranslationText] T, 
    (SELECT [LanguageCode]
      ,[StringNo]
      ,REPLACE([String], 'Favourite','Favorite') ReplacedString
    FROM [dbo].[TranslationText]
    WHERE 
    [String] COLLATE Latin1_General_CS_AS like '%Favourite%'
    AND [LanguageCode] = 'en-us') US_STRINGS
WHERE 
T.[LanguageCode] = US_STRINGS.[LanguageCode] 
AND T.[StringNo] = US_STRINGS.[StringNo]

UPDATE T SET [String] = ReplacedString
FROM [dbo].[TranslationText] T, 
    (SELECT [LanguageCode]
      ,[StringNo]
      , REPLACE([String], 'favourite','favorite') ReplacedString 
    FROM [dbo].[TranslationText]
    WHERE 
    [String] COLLATE Latin1_General_CS_AS like '%favourite%'
    AND [LanguageCode] = 'en-us') US_STRINGS
WHERE 
T.[LanguageCode] = US_STRINGS.[LanguageCode] 
AND T.[StringNo] = US_STRINGS.[StringNo]

Tout d’abord, vérifiez ceci: http://technet.microsoft.com/en-us /library/ms180175(SQL.90).aspx

Vous verrez que CI spécifie la casse et CS spécifie la casse.

De plus, cela pourrait être utile. select * from fn_helpcollations () - cela récupère tous les classements que votre serveur prend en charge. select * from sys.databases - ici, une colonne spécifie le classement de chaque base de données sur votre serveur.

Vous pouvez spécifier le classement chaque fois que vous interrogez la table ou appliquer le classement aux colonnes de manière permanente en modifiant la table.

Si vous choisissez de faire de la méthode de requête son avantage d’inclure également les arguments de recherche insensibles à la casse. Vous verrez que SQL choisira un plan d’exécution plus efficace si vous les incluez. Par exemple:

SELECT testColumn FROM testTable 
    WHERE testColumn COLLATE Latin1_General_CS_AS = 'eXaMpLe' 
    and testColumn = 'eXaMpLe'
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top