Domanda

Per eseguire una ricerca con distinzione tra maiuscole e minuscole su una tabella in un database SQL Server 2000/2005, è necessario utilizzare le regole di confronto corrette.

Come si determina se le regole di confronto predefinite per un database fanno distinzione tra maiuscole e minuscole e, in caso contrario, come eseguire una ricerca / sostituzione con distinzione tra maiuscole e minuscole?

È stato utile?

Soluzione

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' 

Non dare per scontato che le regole di confronto predefinite facciano distinzione tra maiuscole e minuscole, specifica sempre una distinzione tra maiuscole e minuscole ogni volta (utilizzando quella corretta per la tua lingua ovviamente)

Altri suggerimenti

Determina se le regole di confronto predefinite fanno distinzione tra maiuscole e minuscole in questo modo:

select charindex ('RESULT', 'Se il risultato è 0 ci si trova in una modalità di confronto con distinzione tra maiuscole e minuscole')

Il risultato 0 indica che si è in una modalità di confronto con distinzione tra maiuscole e minuscole, 8 indica che non distingue tra maiuscole e minuscole.

Se le regole di confronto non fanno distinzione tra maiuscole e minuscole, è necessario dichiarare esplicitamente la modalità di confronto che si desidera utilizzare quando si esegue una ricerca / sostituzione.

Ecco come costruire un'istruzione UPDATE per eseguire una ricerca / sostituzione con distinzione tra maiuscole e minuscole specificando la modalità di fascicolazione da utilizzare:

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

Questo corrisponderà e sostituirà 'THECONTENT' , ma non 'TheContent' o 'thecontent' .

Se hai casi diversi della stessa parola nello stesso campo e desideri solo sostituire casi specifici , puoi utilizzare regole di confronto nella funzione 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'
    )

Ciò comporterà:

This is camelCase 1 and this is CamelCase 2

divenire:

This is changedWord 1 and this is ChangedWord 2

Può essere fatto in più istruzioni. Questo non funzionerà se hai stringhe lunghe che contengono sia lettere maiuscole che minuscole che intendi sostituire. Potrebbe anche essere necessario utilizzare regole di confronto diverse, questo è accento e maiuscole / minuscole.

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]

Prima di tutto controlla questo: http://technet.microsoft.com/en-us /library/ms180175(SQL.90).aspx

Vedrai che CI specifica la distinzione tra maiuscole e minuscole e CS specifica la distinzione tra maiuscole e minuscole.

Inoltre, potrebbe essere utile. seleziona * da fn_helpcollations () - questo ottiene tutte le regole di confronto supportate dal tuo server. seleziona * da sys.d Database: qui c'è una colonna che specifica quali regole di confronto hanno tutti i database sul tuo server.

Puoi specificare le regole di confronto ogni volta che esegui una query sulla tabella oppure puoi applicare le regole di confronto alle colonne in modo permanente modificando la tabella.

Se si sceglie di eseguire il metodo di query, è utile includere anche gli argomenti di ricerca senza distinzione tra maiuscole e minuscole. Vedrai che SQL sceglierà un piano exec più efficiente se li includi. Ad esempio:

SELECT testColumn FROM testTable 
    WHERE testColumn COLLATE Latin1_General_CS_AS = 'eXaMpLe' 
    and testColumn = 'eXaMpLe'
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top