Pergunta

Como posso verificar para ver se um banco de dados em SQL Server diferencia maiúsculas de minúsculas? Tenho sido previamente executar a consulta:

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

Mas eu estou procurando outras maneiras como isso tem realmente me deu problemas no passado.

Edit - Um pouco mais informação: Um produto já existente tem muitos procedimentos armazenados pré-escritas. Em um procedimento armazenado @test != @TEST dependendo da sensibilidade do próprio servidor. Então o que eu estou procurando é a melhor maneira de verificar o servidor para a sua sensibilidade.

Foi útil?

Solução

Agrupamento pode ser definida em vários níveis:

  1. Servidor
  2. Banco de Dados
  3. Coluna

Assim, você poderá ter uma coluna Sensitive Caso em um banco de dados Insensitive Case. Eu ainda não se deparar com uma situação onde um caso de negócio poderia ser feito para a sensibilidade caso de uma única coluna de dados, mas acho que poderia haver.

Verificar servidor Agrupamento

SELECT SERVERPROPERTY('COLLATION')

Verificação de banco de dados de agrupamento

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

Verifique Coluna Agrupamento

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

Outras dicas

Se você instalou o SQL Server com as opções de agrupamento padrão, você pode achar que as consultas a seguir retornam os mesmos 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' 

Você pode alterar a sua consulta, forçando agrupamento no nível da coluna:

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 alterar essa configuração pode afetar aplicações e consultas SQL, gostaria de isolar este primeiro teste. A partir do SQL Server 2000, você pode facilmente executar uma instrução ALTER TABLE para alterar a ordem de classificação de uma coluna específica, forçando-o a ser maiúsculas de minúsculas. Primeiro, execute a seguinte consulta para determinar o que você precisa alterá-lo de volta para:

EXEC sp_help 'mytable' 

O segundo conjunto de registros deve conter as seguintes informações, em um cenário de default:

Column_Name Agrupamento


mycolumn SQL_Latin1_General_CP1_CI_AS

O que quer que os 'agrupamento' retornos de coluna, você já sabe o que você precisa para mudá-lo de volta depois de se fazer a seguinte alteração, que forçará maiúsculas e 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' 

Se isto os parafusos as coisas, você pode mudá-lo de volta, simplesmente através da emissão de uma nova instrução ALTER TABLE (não se esqueça de substituir o meu identificador COLLATE com o que você encontrou anteriormente):

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

Se você está preso com o SQL Server 7.0, você pode tentar esta solução alternativa, que pode ser um pouco mais de um acerto de desempenho (você só deve obter um resultado para o primeiro jogo):

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' 

servidor SQL determina a sensibilidade caso a COLLATION.

COLLATION pode ser definida em vários níveis.

  1. Servidor de nível
  2. Banco de Dados de nível
  3. Coluna de nível
  4. Expressão de nível

Aqui é a referência MSDN.

Pode-se verificar o COLLATION em cada nível, como mencionado no Raj More resposta .

Verificar servidor Agrupamento

SELECT SERVERPROPERTY('COLLATION')

Verificação de banco de dados de agrupamento

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

Verifique Coluna Agrupamento

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

Verifique Expressão Agrupamento

Para COLLATION nível de expressão que você precisa olhar para a expressão. :)

Seria geralmente no final da expressão como no exemplo abaixo.

SELECT name FROM customer ORDER BY name COLLATE Latin1_General_CS_AI;

Agrupamento Descrição

Para obter descrição de cada valor COLLATION tentar isso.

SELECT * FROM fn_helpcollations()

E você deve ver algo como isso.

enter descri&ccedil;&atilde;o da imagem aqui

Você pode sempre colocar uma cláusula WHERE para filtrar e ver descrição somente para seu COLLATION.

Você pode encontrar uma lista de agrupamentos aqui .

Você está interessado no agrupamento. Você poderia construir algo baseado neste trecho:

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

Atualizar
Com base na sua edição - Se @test e @TEST jamais pode referir-se a duas variáveis ??diferentes, não é SQL Server. Se você ver problemas onde o mesma variável não é igual a si mesmo, verifique se essa variável é NULL, porque NULL = NULL retorna `falsa.

A melhor maneira de trabalhar com tabelas já criados é que, Ir para o SQL Server Editor de Consultas

Tipo: sp_help <tablename>

Isto irá mostrar a estrutura da tabela, consulte os detalhes para o campo desejado na coluna COLLATE.

em seguida, digite a consulta como:

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

Poderia ser personagem diferente esquema <SQL_Latin1_General_CP1_CI_AS>, então é melhor para descobrir o esquema exato que tem sido usada contra essa coluna.

Como posso verificar para ver se um banco de dados em SQL Server diferencia maiúsculas de minúsculas?

Você pode usar o abaixo consulta que retorna seu banco de dados informado é sensível a maiúsculas ou não, ou está na classificação binária (com 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 obter mais ler esta informação MSDN;)

SQL Server não é sensível a maiúsculas. SELECT * FROM SomeTable é o mesmo que SeLeCT * frOM soMetaBLe.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top