2008-09-22 11 views
6

Para realizar una búsqueda/reemplazo sensible a mayúsculas y minúsculas en una tabla en una base de datos SQL Server 2000/2005, debe usar la intercalación correcta.¿Cómo realizo una búsqueda sensible a mayúsculas y reemplazo en SQL 2000/2005?

¿Cómo se determina si la intercalación predeterminada para una base de datos distingue entre mayúsculas y minúsculas, y si no es así, cómo realizar una búsqueda/reemplazo sensible a mayúsculas y minúsculas?

Respuesta

12
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' 

No asuma la colación por defecto será sensible a mayúsculas, basta con especificar un delicado caso cada vez (utilizando el correcto para su idioma, por supuesto)

8

Determinar si la colación por defecto es caso- sensible como este:

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

un resultado de 0 indica que está en un modo de intercalación mayúscula, 8 indica que es sensible a las mayúsculas.

Si la intercalación no distingue entre mayúsculas y minúsculas, debe declarar explícitamente el modo de intercalación que desea utilizar al realizar una búsqueda/sustitución.

Aquí es cómo construir una instrucción UPDATE para realizar una búsqueda entre mayúsculas y minúsculas/sustituir especificando el modo de colación de usar:

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

Esto busque y sustituya 'THECONTENT', pero no 'TheContent' o 'thecontent'.

+0

Esta es la respuesta correcta. –

0

Además, esto podría ser útil. select * from fn_helpcollations() - esto obtiene todas las intercalaciones que admite su servidor. select * from sys.databases - aquí hay una columna que especifica qué colación tiene cada base de datos en su servidor.

0

Puede especificar la intercalación cada vez que consulta la tabla o puede aplicar la intercalación a la (s) columna (s) permanentemente alterando la tabla.

Si elige hacer el método de consulta, es beneficioso incluir los argumentos de búsqueda que no distinguen entre mayúsculas y minúsculas. Verá que SQL elegirá un plan ejecutivo más eficiente si los incluye. Por ejemplo:

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

Se puede hacer en varias instrucciones. no funcionará si tiene cadenas largas que contienen letras mayúsculas y minúsculas que tiene la intención de reemplazar. También es posible que necesite usar una intercalación diferente, esto es acento y distingue entre mayúsculas y 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] 
2

Si tiene casos diferentes de la misma palabra en el mismo campo, y sólo desea reemplazan casos específicos, a continuación, puede utilizar colación en su REPLACE función:

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' 
    ) 

Esto dará como resultado:

This is camelCase 1 and this is CamelCase 2 

convertirse en:

This is changedWord 1 and this is ChangedWord 2 
Cuestiones relacionadas