Resolver conflitos de COLLATION no SQLServer

Neste post vamos resolver um problema extremamente simples, mas comum, principalmente quando temos a necessidade de fazer uma consulta relacionando tabelas de duas databases de collates distintos.

Mas, o que é COLLATE?

Collate, é a configuração que determina como o engine do SQLServer deve tratar os dados armazenados na sua database, podendo ser configurado a nível de database, tabela ou coluna.

Veremos abaixo um exemplo de collate para as coisas ficarem mais claras.

COLLATE LATIN1_GENERAL_CS_AI

LATIN1 - Determina o CHARSET, o conjunto de caracteres ao qual os 
dados estão normatizados.
CS - Determina que o conjunto de dados é também Case Sensitive, 
ou seja, maiúsculos e minúsculos serão diferenciados.
AI - Determina os dados como Accent Insensitive, fazendo assim 
com que acentuação seja desprezada.
 

Como verifico qual o COLLATE da minha Database?

SELECT name, collation_name FROM sys.databases;
 

E para resolver os conflitos entre collates diferentes em uma consulta?

Quando essa situação ocorre, o erro retornado é:

Cannot resolve collation conflict between 
"SQL_Latin1_General_CP1_CI_AS" and "Latin1_General_CI_AS";
(en). 

Não é possível resolver o conflito de intercalação entre 
"SQL_Latin1_General_CP1_CI_AS" e "Latin1_General_CI_AS";
(pt-br).

Para resolver, não precisamos alterar a configuração de COLLATE da database. Basta diretamente na consulta, forçar a tabela onde o conflito é apontado, utilizar o collate desejado.

SELECT A.Nome, B.Cargo FROM Database1.dbo.Funcionarios AS A
INNER JOIN Database2.dbo.Funcoes AS B 
ON (A.CodigoFuncao = B.CodigoFuncao COLLATE SQL_Latin1_General_CP1_CI_AS)

Resolver conflitos de COLLATION no SQLServer

Deixe uma resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *

Rolar para o topo