2008-11-20 11 views
7

Me gustaría encontrar todas las filas en una tabla y hacer coincidir una cadena sensible a mayúsculas y minúsculas. Lamentablemente, mi tabla tiene la intercalación insensible a mayúsculas y minúsculas.¿Cómo realizo una coincidencia de cadena exacta en un campo que no distingue entre mayúsculas y minúsculas?

Cuál es la forma más eficiente de realizar esto.

Por ejemplo.

Me gustaría que el siguiente para devolver ninguna fila:

select * from sysobject where name = 'Sysbinobjs' 

Para la respuesta asume @match está en una variable:

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

EDITAR

Aclaración, asegúrese los espacios finales se tratan adecuadamente, quiero una coincidencia exacta que tenga en cuenta los espacios finales, por lo que 'Hola' solo se combinará con 'Hola' y no con 'Hola'

Respuesta

7

Aquí hay un fragmento de código que funciona, es realmente complicado hacer esto de una manera segura y eficiente. La doble coincidencia es evitar una exploración de tabla (consulte el plan de ejecución). El vaciado varbinary fuerza una coincidencia de longitud y caso. Por lo tanto, los espacios al final se tratan adecuadamente y la carcasa se trata adecuadamente.

Nota del tipo que se comparan las necesidades para ser idéntico al tipo en la tabla para el varbinary fundición a trabajar (por ejemplo. Nombre en sysobject es un nvarchar por lo que el @match tendrá que ser 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 realidad no veo por qué tiene que hacer el escape que en primer lugar, este está integrado en el servidor SQL a través de la DECLARACIÓN DE CLASIFICAR.

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

Simplifiqué mi respuesta, el problema con esto es que los espacios al final no se tratan adecuadamente, por ejemplo. 'hola' = 'hola', también creo que el material de recopilación es difícil de recordar al codificar. –

+0

+1 ¡Eres un genio, amigo mío, esta solución funcionó muy bien para mí! –

Cuestiones relacionadas