Pergunta

A fim de realizar uma pesquisa diferencia maiúsculas de minúsculas / substituir em uma tabela em um banco de dados SQL Server 2000/2005, é necessário usar o agrupamento correto.

Como você determinar se o agrupamento padrão para um banco de dados diferencia maiúsculas de minúsculas, e se não é, como realizar uma pesquisa diferencia maiúsculas de minúsculas / substituir?

Foi útil?

Solução

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' 

Não assumir o agrupamento padrão será sensível a maiúsculas, basta especificar um caso um sensível cada vez (usando o correto para o seu idioma, é claro)

Outras dicas

Determinar se o agrupamento padrão é sensível a maiúsculas assim:

select charindex('RESULT', 'If the result is 0 you are in a case-sensitive collation mode')

Um resultado de 0 indica que você está em um modo de agrupamento entre maiúsculas e minúsculas, 8 indica que é case-insensitive.

Se o agrupamento é case-insensitive, você precisa declarar explicitamente o modo de agrupamento que deseja usar ao realizar uma busca / substituição.

Aqui é como construir uma instrução UPDATE para realizar uma pesquisa diferencia maiúsculas de minúsculas / substituir, indicando o modo de intercalação a utilização:

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

Isso irá corresponder e substituir 'THECONTENT', mas não 'TheContent' ou 'thecontent'.

Se você tem casos diferentes da mesma palavra no mesmo campo , e só quer substituir casos específicos , então você pode usar agrupamento em sua função 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'
    )

Isto irá resultar em:

This is camelCase 1 and this is CamelCase 2

tornando-se:

This is changedWord 1 and this is ChangedWord 2

Pode ser feito em várias instruções. Este não vai trabalho se você tem longas cadeias que contêm maiúscula um minúsculas palavras que você pretende substituir. Você também pode precisar usar agrupamento diferente este é o sotaque e maiúsculas e minúsculas.

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]

Em primeiro lugar verificar isso: http://technet.microsoft.com/en-us /library/ms180175(SQL.90).aspx

Você vai ver que CI especifica case-insensitive e CS especifica maiúsculas de minúsculas.

Além disso, isso pode ser útil. SELECT * FROM fn_helpcollations () - este recebe todos os agrupamentos o seu servidor suporta. SELECT * FROM sys.databases -. aqui há uma coluna que especifica o que agrupamento tem todo o banco de dados no seu servidor

Você pode especificar o agrupamento cada vez que você consultar a tabela ou você pode aplicar o agrupamento para a coluna (s) permanentemente alterando a tabela.

Se você optar por fazer o método de consulta a sua benéfico para incluir o caso argumentos de pesquisa insensíveis também. Você vai ver que o SQL irá escolher um plano exec mais eficiente se você incluí-los. Por exemplo:

SELECT testColumn FROM testTable 
    WHERE testColumn COLLATE Latin1_General_CS_AS = 'eXaMpLe' 
    and testColumn = 'eXaMpLe'
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top