Páginas

terça-feira, 26 de maio de 2015

[MS SQL Server] - Conflitos de COLLATION em operações de comparação

Em bancos de dados SQL Server, as Collations são utilizadas para definir a maneira como os dados do tipo string (nchar, nvarchar, e ntext) são armazenados.
Em resumo, uma collation define:
  • A codificação (Character Set) utilizada para armazenar os caracteres não-Unicode.
  • O algoritmo de ordenação utilizado para ordenar o retorno das consultas
O SQL Server permite que seja configurada uma collation default para o servidor,atribuindo-a a todos os campos cuja collation não é explicitamente definida durante a criação.

Além disso, as collations podem ser definidas em diferentes granularidades. É possível definir collations para bancos de dados, tabelas, campos de tabelas e variáveis do SQL Server.

Entretanto, o uso de diversas collations em uma mesma base de dados pode causar problemas ao desenvolvedor, pois algumas collations não são compatíveis entre si. Um problema comum ao escrever consultas envolvendo comparação de campos de texto com collations diferentes é o confilto nessa operação de igualdade.

"Cannot resolve collation conflict for equal to operation"

Uma solução para este problema é indicar ao processador de consultas qual collation deverá ser utilizada para realizar a comparação entre os dois valores. Para isso, deve-se utilizar o comandoCOLLATE. Além disso, pode-se passar como argumento a palavra-chave DATABASE_DEFAULT, que retorna a collation definida para o banco de dados em uso. Veja o exemplo abaixo:


SELECT userName FROM Usuarios
INNER JOIN Clientes ON 
Clientes.userName COLLATE DATABASE_DEFAULT
= Usuarios.userName  COLLATE DATABASE_DEFAULT

No exemplo, foi feita a junção entre as tabelas "Usuarios" e "Clientes", utilizando-se o campo userName, presente em ambas as tabelas. Supõe-se que este campo possua collations diferentes e conflitantes nestas tabelas. O comando COLLATE resolve o conflito na operação de igualdade do JOIN, utilizando a collation padrão do banco.
http://www.sqlserverdicas.com/2010/08/em-bancos-de-dados-sql-server-as.html

2 comentários:

  1. A mesclagem foi concluída após o processamento de 0 alteração(ões) de dados (0 inserção(ões), 0 atualização(ões), 0 exclusão(ões), 502 conflito(s)).

    esta acontecendo isso comigo, o ASSINANTE consegue ver as informações do PUBLICADOR, mas o inverso nao. (são vendas) pode me ajudar amigo?

    ResponderExcluir
  2. Boa Tarde Alexandre,
    Você pode informar fixamente o collation de ambas tabelas de forma que necessariamente tenha esse problema de conflito do tipo de grupo de caracteres.

    Tenta usar esse exemplo abaixo e verifica qual o collate das suas tabelas , para ver se as mesmas tem o mesmo tipo de collatte:

    SELECT userName FROM Usuarios
    INNER JOIN Clientes ON
    Clientes.userName COLLATE Latin1_General_CI_AI
    = Usuarios.userName COLLATE Latin1_General_CI_AI

    Att,
    Emerson

    ResponderExcluir