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.
- Nivel de servidor
- Nivel de base de datos
- Nivel de columna
- 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:
- Servidor
- Base de datos
- 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.