sensitive instr ejemplos ejemplo charindex sql sql-server tsql case-sensitive

instr - SQL Server comprueba la sensibilidad de mayúsculas y minúsculas



sql server like case sensitive (7)

¿Cómo puedo verificar si una base de datos en SQL Server distingue entre mayúsculas y minúsculas?

Puede usar la consulta siguiente que devuelve su base de datos informada distingue entre mayúsculas y minúsculas o no, o está en orden binario (con resultado nulo):

;WITH collations AS ( SELECT name, CASE WHEN description like ''%case-insensitive%'' THEN 0 WHEN description like ''%case-sensitive%'' THEN 1 END isCaseSensitive FROM sys.fn_helpcollations() ) SELECT * FROM collations WHERE name = CONVERT(varchar, DATABASEPROPERTYEX(''yourDatabaseName'',''collation''));

Para obtener más información, lea esta información de MSDN ;).

¿Cómo puedo verificar si una base de datos en SQL Server distingue entre mayúsculas y minúsculas? Anteriormente he estado ejecutando la consulta:

SELECT CASE WHEN ''A'' = ''a'' THEN ''NOT CASE SENSITIVE'' ELSE ''CASE SENSITIVE'' END

Pero estoy buscando otras formas, ya que esto me ha dado problemas en el pasado.

Editar: un poco más de información: un producto existente tiene muchos procedimientos almacenados previamente escritos. En un procedimiento almacenado @test != @TEST dependiendo de la sensibilidad del servidor. Entonces, lo que estoy buscando es la mejor manera de verificar la sensibilidad del servidor.


El servidor SQL determina la sensibilidad de mayúsculas y minúsculas mediante COLLATION .

COLLATION se puede establecer en varios niveles.

  1. Nivel de servidor
  2. Nivel de base de datos
  3. Nivel de columna
  4. Nivel de expresión

Aquí está la referencia de MSDN.

Se puede verificar la COLLATION en cada nivel como se menciona en la respuesta de Raj More .

Comprobar colación del servidor

SELECT SERVERPROPERTY(''COLLATION'')

Verificar colación de la base de datos

SELECT DATABASEPROPERTYEX(''AdventureWorks'', ''Collation'') SQLCollation;

Verificar colación de columnas

select table_name, column_name, collation_name from INFORMATION_SCHEMA.COLUMNS where table_name = @table_name

Comprobar colación de expresiones

Para el nivel de expresión COLLATION necesitas mirar la expresión. :)

En general, se encontraría al final de la expresión como en el ejemplo siguiente.

SELECT name FROM customer ORDER BY name COLLATE Latin1_General_CS_AI;

Descripción de la intercalación

Para obtener una descripción de cada valor de COLLATION prueba esto.

SELECT * FROM fn_helpcollations()

Y deberías ver algo como esto.

Siempre puede poner una cláusula WHERE para filtrar y ver la descripción solo para su COLLATION .

Puede encontrar una lista de intercalaciones here .


La intercalación puede establecerse en varios niveles:

  1. Servidor
  2. Base de datos
  3. Columna

Por lo tanto, podría tener una columna sensible a las mayúsculas y minúsculas en una base de datos sin distinción de mayúsculas y minúsculas. Todavía no me he encontrado con una situación en la que se pudiera presentar un caso de negocio por la distinción entre mayúsculas y minúsculas de una sola columna de datos, pero supongo que podría haberla.

Comprobar colación del servidor

SELECT SERVERPROPERTY(''COLLATION'')

Verificar colación de la base de datos

SELECT DATABASEPROPERTYEX(''AdventureWorks'', ''Collation'') SQLCollation;

Verificar colación de columnas

select table_name, column_name, collation_name from INFORMATION_SCHEMA.COLUMNS where table_name = @table_name


La mejor manera de trabajar con tablas ya creadas es que, vaya a Sql Server Query Editor

Tipo: sp_help <tablename>

Esto mostrará la estructura de la tabla, vea los detalles para el campo deseado en la columna COLLAR.

a continuación, escriba la consulta como:

SELECT myColumn FROM myTable WHERE myColumn COLLATE SQL_Latin1_General_CP1_CI_AS = ''Case''

Podría tratarse de un esquema de caracteres diferente < SQL_Latin1_General_CP1_CI_AS >, por lo que es mejor averiguar el esquema exacto que se ha utilizado en esa columna.


SQL Server no distingue entre mayúsculas y minúsculas. SELECT * FROM SomeTable es lo mismo que SeLeCT * frOM soMetaBLe .


Si instaló SQL Server con las opciones de intercalación predeterminadas, puede encontrar que las siguientes consultas arrojan los mismos resultados:

CREATE TABLE mytable ( mycolumn VARCHAR(10) ) GO SET NOCOUNT ON INSERT mytable VALUES(''Case'') GO SELECT mycolumn FROM mytable WHERE mycolumn=''Case'' SELECT mycolumn FROM mytable WHERE mycolumn=''caSE'' SELECT mycolumn FROM mytable WHERE mycolumn=''case''

Puede modificar su consulta forzando la intercalación en el nivel de columna:

SELECT myColumn FROM myTable WHERE myColumn COLLATE Latin1_General_CS_AS = ''caSE'' SELECT myColumn FROM myTable WHERE myColumn COLLATE Latin1_General_CS_AS = ''case'' SELECT myColumn FROM myTable WHERE myColumn COLLATE Latin1_General_CS_AS = ''Case'' -- if myColumn has an index, you will likely benefit by adding -- AND myColumn = ''case'' SELECT DATABASEPROPERTYEX(''<database name>'', ''Collation'')

Como cambiar esta configuración puede afectar las aplicaciones y las consultas SQL, primero aislaría esta prueba. Desde SQL Server 2000, puede ejecutar fácilmente una instrucción ALTER TABLE para cambiar el orden de clasificación de una columna específica, forzándola a distinguir entre mayúsculas y minúsculas. Primero, ejecute la siguiente consulta para determinar a qué necesita volver a cambiar:

EXEC sp_help ''mytable''

El segundo conjunto de registros debe contener la siguiente información, en un escenario predeterminado:

Collation_Name Collation

mycolumn SQL_Latin1_General_CP1_CI_AS

Cualquiera que sea la columna de ''Intercalación'', ahora sabe a qué tiene que volver a cambiarla después de realizar el siguiente cambio, que forzará la distinción entre mayúsculas y minúsculas:

ALTER TABLE mytable ALTER COLUMN mycolumn VARCHAR(10) COLLATE Latin1_General_CS_AS GO SELECT mycolumn FROM mytable WHERE mycolumn=''Case'' SELECT mycolumn FROM mytable WHERE mycolumn=''caSE'' SELECT mycolumn FROM mytable WHERE mycolumn=''case''

Si esto arruina las cosas, puede volver a cambiarlo, simplemente emitiendo una nueva instrucción ALTER TABLE (asegúrese de reemplazar mi identificador COLLATE por el que encontró anteriormente):

ALTER TABLE mytable ALTER COLUMN mycolumn VARCHAR(10) COLLATE SQL_Latin1_General_CP1_CI_AS

Si está atascado con SQL Server 7.0, puede probar esta solución, que podría ser un poco más de un golpe de rendimiento (solo debería obtener un resultado para la PRIMERA coincidencia):

SELECT mycolumn FROM mytable WHERE mycolumn = ''case'' AND CAST(mycolumn AS VARBINARY(10)) = CAST(''Case'' AS VARBINARY(10)) SELECT mycolumn FROM mytable WHERE mycolumn = ''case'' AND CAST(mycolumn AS VARBINARY(10)) = CAST(''caSE'' AS VARBINARY(10)) SELECT mycolumn FROM mytable WHERE mycolumn = ''case'' AND CAST(mycolumn AS VARBINARY(10)) = CAST(''case'' AS VARBINARY(10)) -- if myColumn has an index, you will likely benefit by adding -- AND myColumn = ''case''


Usted está interesado en la recopilación. Puedes construir algo basado en este fragmento:

SELECT DATABASEPROPERTYEX(''master'', ''Collation'');

Actualizar
En función de su edición, si @test y @TEST pueden referirse a dos variables diferentes, no es SQL Server. Si ve problemas donde la misma variable no es igual a sí misma, verifique si esa variable es NULL , porque NULL = NULL devuelve `false.