verificação de maiúsculas e minúsculas SQL Server?
-
05-07-2019 - |
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.
Solução
Agrupamento pode ser definida em vários níveis:
- Servidor
- Banco de Dados
- 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.
- Servidor de nível
- Banco de Dados de nível
- Coluna de nível
- Expressão de nível
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.
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
.