Atualização de SQL Server para Service Pack 3 falha com erro 446

Por Helio Rosental

Recentemente tive um caso que não era difícil mas tomou mais tempo do que deveria devido a situação não ser comum nos USA, mas que tem uma grande chance de ocorrer em países da America Latina e Europa.

O problema tem a ver com o seguinte error que aconteceu durante uma atualização de um servidor SQL Server 2005 do Service Pack 2 para Service Pack 3:

MSP Error: 29536  SQL Server Setup has encountered the following problem: [Microsoft][SQL Native Client][SQL Server]Cannot resolve the collation conflict between "Latin1_General_CI_AS" and "Latin1_General_CI_AI" in the equal to operation.. To continue, correct the problem, and then run SQL Server Setup again.

Como é possível receber o erro 446 durante a instalação do Service Pack se SQL Server permite configurações de "collation" a nível de servidor, base de dados e até mesmo colunas em tabelas?

A resposta a esta questão tem a ver com o modo que SQL Server manipula "collations" de diferentes granularidades e esta muito bem documentada em SQL Server 2005 Books Online no assunto genérico "Collations". Verifique o parágrafo "Collations and tempdb" do tópico "Setting and Changing the Column Collation", o qual explica como o conflito pode ocorrer por termos "collations" em bases de usuários diferentes do "collation" das bases do sistema. No meu caso, a base master tinha um "collation" diferente das demais bases de sistema causando o erro.

Essa configuração aonde uma ou mais base de dados de sistema tem "collations" diferentes está muito alem de ser suportada e esta completamente errada. O único modo de termos este cenário é restaurando uma cópia de segurança da base de sistema de um outro servidor.

Para resolver este problema você deve fazer o seguinte:

1.  Recuperar a base de sistema conflitante a partir de uma copia de segurança que seja da mesma base com "collation" igual a das outras bases de sistema, se disponível.

2.  Reconstruir as bases de sistema.

Vale a pena mencionar também que o SQL Server Best Practices Analyzer teria identificado a situação e recomendado consertá-la.