Pregunta

¿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 porque esto me ha dado problemas en el pasado.

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

¿Fue útil?

Solución

La clasificación se puede establecer en varios niveles:

  1. Servidor
  2. Base de datos
  3. Columna

Entonces podría tener una columna sensible a mayúsculas y minúsculas en una base de datos insensible a mayúsculas y minúsculas. Todavía no me he encontrado con una situación en la que se pueda hacer un caso de negocios para la distinción entre mayúsculas y minúsculas de una sola columna de datos, pero supongo que podría haberlo.

Comprobar clasificación del servidor

SELECT SERVERPROPERTY('COLLATION')

Comprobar clasificación de la base de datos

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

Comprobar clasificación de columnas

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

Otros consejos

Si instaló SQL Server con las opciones de clasificación predeterminadas, es posible que las siguientes consultas devuelvan 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 clasificació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, lo que obliga a que distinga entre mayúsculas y minúsculas. Primero, ejecute la siguiente consulta para determinar a qué necesita volver a cambiarla:

EXEC sp_help 'mytable' 

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

Intercalación Column_Name


mycolumn SQL_Latin1_General_CP1_CI_AS

Independientemente de lo que devuelva la columna 'Colación', ahora sabe a qué debe volver a cambiar después de realizar el siguiente cambio, lo 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 cambiarlo de nuevo, simplemente emitiendo una nueva declaración ALTER TABLE (asegúrese de reemplazar mi identificador COLLATE con 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 alternativa, que podría ser un poco más 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' 

El servidor SQL determina la distinción entre mayúsculas y minúsculas por COLLATION.

WHERE se puede configurar 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 el <=> en cada nivel como se menciona en la respuesta de Raj More .

Comprobar clasificación del servidor

SELECT SERVERPROPERTY('COLLATION')

Comprobar clasificación de la base de datos

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

Comprobar clasificación de columnas

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

Comprobar clasificación de expresiones

Para el nivel de expresión <=> necesita mirar la expresión. :)

Por lo general, estaría al final de la expresión como en el siguiente ejemplo.

SELECT name FROM customer ORDER BY name COLLATE Latin1_General_CS_AI;

Descripción de clasificación

Para obtener una descripción de cada valor <=> intente esto.

SELECT * FROM fn_helpcollations()

Y deberías ver algo como esto.

ingrese la descripci&oacute;n de la imagen aqu&iacute;

Siempre puede poner una cláusula <=> para filtrar y ver la descripción solo para su <=>.

Puede encontrar una lista de intercalaciones aquí .

Te interesa el cotejo.Podrías crear algo basado en este fragmento:

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

Actualizar
Según su edición, si @test y @TEST alguna vez puede hacer referencia a dos variables diferentes, no es SQL Server.Si ve problemas donde el mismo La variable no es igual a sí misma, verifique si esa variable es NULL, porque NULL = NULL devuelve `falso.

La mejor manera de trabajar con tablas ya creadas es que, Vaya al Editor de consultas del servidor SQL

Tipo: sp_help <tablename>

Esto mostrará la estructura de la tabla, vea los detalles del campo deseado en la columna COLLATE.

luego escriba la consulta como:

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

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

  

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

Puede usar la siguiente consulta que devuelve que su base de datos informada distingue entre mayúsculas y minúsculas 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 más información, lea esta información de MSDN ;).

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top