Conflito em Collation

segunda-feira, 19 de outubro de 2009

Olá! Hoje vou falar sobre Collation. Ou Agrupamento, que é responsável por definir o tipo de codificação para o conjunto de caracteres de um banco de dados, tabela ou coluna.

Obrigatoriamente, ao instalar uma instância do SQL Server (2000, 2005 ou 2008), é possível escolher a Collation a ser usada como padrão. Ao criar um banco de dados, se nada for definido/alterado, a Collation usada será a padrão escolhida para a instância. Mesmo caso para a criação de uma coluna em uma tabela, se nada for definido, a collation padrão é a do banco de dados.

Para explicar melhor, mostro um exemplo possível de diferentes Collations definidas:

  • SQL_Latin_General_CP850_CI_AS para uma instância;
  • Latin1_General_CI_AS para um database desta mesma instância;
  • SQL_Latin1_General_CP1_CI_AI para uma coluna de uma tabela deste mesmo banco de dados.

Bom, esta semana tive um problema onde através de dois bancos diferentes, uma consulta buscando dados em um Linked Server, buscava dados de uma tabela tA no banco de dados A e servidor A e os relacionava com os campos B1, B2, B3 da VIEW vB e servidor B. Sim, da View B.

Erro:
Cannot resolve collation conflict for equal to operation.

Localizei a tabela tB, representada na view vB, alterei a Collation das colunas envolvidas no select para a mesma Collation usada nas colunas A1, A2 e A3:



ALTER TABLE tB ALTER COLUMN B1 CHAR(10) COLLATE SQL_Latin1_General_CP1_CI_AI NOT NULL
GO
ALTER TABLE tB ALTER COLUMN B2 CHAR(10) COLLATE SQL_Latin1_General_CP1_CI_AI NOT NULL
GO
ALTER TABLE tB ALTER COLUMN B3 CHAR(10) COLLATE SQL_Latin1_General_CP1_CI_AI NULL
GO



Porém mesmo assim ao executar a query, o erro era o mesmo. Erro:
Cannot resolve collation conflict for equal to operation.

Percebi então que mesmo depois da alteração, nas propriedades daquela View, todas as colunas em sua estrutura ainda tinham a Collation antiga. Foi então que rodei o seguinte comando:



SP_REFRESHVIEW vB

GO



Executei novamente a query e já não havia mais conflito. \o/

Em resumo, se a alteração fosse feita no database, os objetos ali já criados permaneceriam com sua Collation anteriormente definida inalteradas. É necessário então modificar a Collation em tabela por tabela e ao final fazer Refresh nas Views.


Estes links ajudaram muito a solucionar este problema:

http://gustavomaiaaguiar.spaces.live.com/blog/cns!F4F5C630410B9865!183.entry

http://www.sqlteam.com/forums/topic.asp?TOPIC_ID=96516

0 comentários: