Como resolver problemas relacionados a conflitos de Collation

Boa Noite,

Esse é um dos erros comuns quando trabalhamos com colunas textuais em operações de concatenação ou quando colunas textuais são utilizadas em operações de junção (JOINs) ou em combinação de resultados distintos (UNION). Nesse artigo descreverei porque isso acontece e alternativas para contornar ou resolver esse erro.

Um pouco sobre collation

Não sei se todos os que recebem essa mensagem sabem propriamente porque ela acontece e o que é o tal da collation. No fim das contas o que é importa é resolver o problema (mesmo sem saber exatamente qual era), mas penso que resolver o problema sabendo do que se trata é melhor do que resolvê-lo sem saber do que se trata. Assim sendo, farei uma breve descrição do que é collation.

Definir collation pode ser um pouco difícil, mas para tornar esse conceito simples, prefiro dizer que collation é a forma como tipos textuais serão armazenados, comparados e ordenados. A escolha da collation influenciará nesses três aspectos e a partir disso é que algumas facilidades podem ou não estar disponíveis. Uma collation que faça distinção entre maiúsculas e minúsculas considerará a letra "A" e a letra "a" como caractéres diferentes. Uma collation que faça distinção entre acentos também considerará a letra "Á" diferente da letra "A". Se a collation não faz distinção entre maiúsculas e minúsculas e nem acentos, então poderemos considerar que as letras "A", "a", "Á", "á", "À", "à", "Ã" e "ã" são equivalentes. Há um artigo muito bom publicado por Mauro Pichiliani explicando mais sobre collations. Recomendo que os interessados dêem uma lida. O artigo pode ser acessado através do link http://imasters.uol.com.br/artigo/262. Para aqueles que querem escovar bits e byte em torno desse assunto, o livro Inside SQL Server 2005 – The Storage Engine será de grande valia.

A escolha da collation tem alguns efeitos bem interessantes que merecem ser conhecidos para que você não seja surpreendido. Se você possuir uma collation que faça distinções entre acentos, ao fazer um pesquisa do tipo "Texto LIKE ‘%José%’", você poderá descobrir que os registros que tiverem o nome "Jose" não serão retornados, pois, não possuem acentos. O SQL Server armazena o nome das tabelas, views, procedures e functions em tabelas de sistema e toda vez que um objeto é chamado, uma pesquisa nessas tabelas de sistema é realizada. Se a collation do banco diferenciar maiúsculas de minúsculas, haverá uma diferença entre "SELECT * FROM Tabela" e "SELECT * FROM TABELA". Se há diferença, será necessário digitar o nome da tabela de forma idêntica ao nome criado (imagine quantas confusões não poderiam acontecer se a collation implementada diferenciar maiúsculas de minúsculas).

A collation possui uma hierarquia de três níveis. Podemos definí-la em nível de servidor, em nível de banco e em nível de coluna. A collation em nível de servidor é definida no momento da instalação e se errarmos poderá ser necessário reinstalar o SQL Server (há uma procedimento a respeito publicado por Nilton Pinheiro no site MCDBA Brasil e o mesmo está disponível através do link http://www.mcdbabrasil.com.br/modules.php?name=News&file=article&sid=244). As collations em nível de banco de dados e de coluna podem ser alteradas sem maiores impactos.

Toda vez que uma collation não é especificada, a collation do nível superior é escolhida. Dessa forma, se criarmos um banco de dados e não especificamos a collation, automaticamente a collation do servidor será escolhida para esse banco de dados, se criarmos uma tabela e nela houver colunas textuais sem especificação de collation, automaticamente a collation do banco de dados será atribuída para essas colunas.

Reproduzindo o erro

Enquanto não houver qualquer combinação entre colunas textuais não há como o problema ocorrer. Ainda que colunas textuais sejam combinadas, se todas tiverem a mesma collation também não haverá problemas. Os problemas se manisfestam quando há combinações de colunas textuais com collations diferentes. Façamos um pequeno teste para simular esse problema através do script abaixo:

— Cria a tabela de Atrizes
CREATE TABLE Atrizes (
    Nome VARCHAR(50) COLLATE Latin1_General_CI_AI,
    SobreNome VARCHAR(50) COLLATE Latin1_General_CI_AS)

— Insere registros
INSERT INTO Atrizes VALUES (‘Deborah’,‘Seco’)
INSERT INTO Atrizes VALUES (‘Juliana’,‘Paes’)
INSERT INTO Atrizes VALUES (‘Carol’,‘Castro’)
INSERT INTO Atrizes VALUES (‘Cláudia’,‘Abreu’)

— Combina o nome e o sobrenome em uma única coluna para as atrizes
SELECT Nome, SobreNome, Nome + ‘ ‘ + SobreNome FROM Atrizes

Nesse caso, a mensagem de erro abaixo é produzida:

Msg 457, Level 16, State 1, Line 1
Implicit conversion of varchar value to varchar cannot be performed because the collation of the value is unresolved due to a collation conflict.

Se fizermos uma combinação entre nomes e sobrenomes usando o UNION ou o JOIN também teremos problemas

— Cria a tabela de Atores
CREATE TABLE Atores (
    Nome VARCHAR(50) COLLATE Latin1_General_CI_AS,
    SobreNome VARCHAR(50) COLLATE Latin1_General_CI_AI)

— Insere registros
INSERT INTO Atores VALUES (‘Edson’,‘Celulari’)
INSERT INTO Atores VALUES (‘José’,‘Abreu’)
INSERT INTO Atores VALUES (‘Murilo’,‘Benício’)
INSERT INTO Atores VALUES (‘Tarcísio’,‘Meira’)

— Lista todos as atores e atrizes
SELECT Nome, SobreNome FROM Atores
UNION ALL
SELECT
Nome, SobreNome FROM Atrizes

— Lista atores e atrizes com o mesmo sobrenome
SELECT AO.Nome, AO.SobreNome, AA.Nome, AA.SobreNome
FROM Atores AS AO INNER JOIN Atrizes AS AA
ON AO.SobreNome = AA.SobreNome

Msg 457, Level 16, State 1, Line 2
Implicit conversion of varchar value to varchar cannot be performed because the collation of the value is unresolved due to a collation conflict.

Msg 468, Level 16, State 9, Line 1
Cannot resolve the collation conflict between "Latin1_General_CI_AS" and "Latin1_General_CI_AI" in the equal to operation.

Através das mensagens postadas podemos identificar um conflito relacionados a escolha da collation. Na tabela de atrizes, a collation escolhida para nome difere da collation escolhida para sobrenome produzindo o erro quando essas colunas tem de ser concatenadas.

No momento de fazer o UNION das tabelas, a collation da coluna nome da tabela Atrizes diferente da collation da coluna nome da tabela atores. O mesmo ocorre para a coluna sobrenome de ambas as tabelas.

A diferença de collations na coluna sobrenome também inviabiliza o JOIN que embora tenha uma mensagem um pouco diferente, retorna que um conflito de collation prejudica a operação.

Como podemos observar, quando há uma diferença de collations e desejamos combinar as colunas, um conflito pode se manisfestar inviabilizando a consulta de retornar os resultados desejados.

Soluções Alternativas

Quando há diferença entre as collations, para que o conflito não se manifeste é necessário igualar as collations. Se as collations forem iguais, então não há porque o conflito ocorrer. Umas das formas de fazer isso é através de pequenas modificações nas consultas. Ex:

— Combina o nome e o sobrenome em uma única coluna
SELECT Nome, SobreNome,
    CAST(Nome AS VARCHAR(50)) COLLATE Latin1_General_CI_AI + ‘ ‘ + SobreNome
FROM Atrizes

— Lista todos os atores e atrizes
SELECT Nome, SobreNome FROM Atores
UNION ALL
SELECT
    Nome COLLATE Latin1_General_CI_AI,
    SobreNome COLLATE Latin1_General_CI_AS
FROM Atrizes

— Lista atores e atrizes com o mesmo sobrenome
SELECT AO.Nome, AO.SobreNome, AA.Nome, AA.SobreNome
FROM Atores AS AO INNER JOIN Atrizes AS AA
ON CAST(AO.SobreNome AS VARCHAR(50)) COLLATE Latin1_General_CI_AS = AA.SobreNome

— Lista atores e atrizes com o mesmo sobrenome
SELECT AO.Nome, AO.SobreNome, AA.Nome, AA.SobreNome
FROM Atores AS AO INNER JOIN Atrizes AS AA
ON AO.SobreNome COLLATE Latin1_General_CI_AS = AA.SobreNome

Para igualar a collation, pode-se converter a coluna para o mesmo tipo de dados e especificar a collation através da palavra Collate ou simplesmente utlizar a palavra collate com a especificação de collation desejada. O exemplo dos JOINs demonstra que as duas condições são permitidas.

Há dois problemas com esse tipo de solução. A primeiro é que uma vez que a especificação da collation torna-se obrigatória para combinar colunas textuais, isso pode significar que boa parte das consultas tenham de contemplar essa especificação. O resultado final pode ser bem desagradável afinal alterações por todo o código serão necessárias. O outro ponto negativo é o desempenho. Toda vez que a coluna de uma collation é trocada, será necessário converter todas as linhas para a nova collation. Para piorar a situação, índices que estejam sobre colunas textuais serão desprezados uma vez que não podemos garantir que a ordem dos registros será a mesma antes e após a collation ser trocada. Na cláusula SELECT esse problema não é tão crítico, mas em JOINs pode levar a uma demora sensível no tempo e processamento da consulta. Para diminuir o overhead é recomendável converter apenas uma coluna para a nova collation (normalmente a da tabela menor). Em todo caso, o overhead continuará existindo.

Resolução definitiva

Uma vez que collations diferentes possam levar a conflitos no momento de combinar colunas textuais, a solução definitiva é trocar as collations utilizadas para uma única collation. Assim não haverá mais problemas em combinar colunas textuais. Essa parece ser uma solução adequada, mas alguns pontos merecem atenção antes de adotá-la.

Os bancos de dados possuem uma collation própria. Assim sendo, se você alterar a collation do servidor e restaurar o backup dos bancos de dados, as collations ficarão divergentes já que os bancos de dados continuaram a manter sua collation original. Isso pode parecer não representar problemas, mas lembre-se que o TempDB irá utilizar a collation do servidor. Se você criar tabelas temporárias, elas utilizarão a collation do servidor e se essa divergir da collation do banco os mesmos problemas apresentados podem ocorrer quando você combinar tabelas temporárias com as tabelas do banco (a menos que na criação das tabelas temporárias você especifique a mesma collation que a do banco ou as crie usando a instrução SELECT INTO).

As colunas possuem collation própria e caso você troque a collation do banco de dados através da instrução ALTER DATABASE, apenas as novas colunas irão obedecer a nova collation. As colunas antigas terão a collation original. Uma vez que a collation influencia a forma como os caractéres são armazenados, comparados e ordenados, trocar a collation do banco de dados não terá efeito sobre a collation das colunas existentes, pois, os dados já estão gravados.

Dados as considerações citadas, para conseguir unificar a collation é necessário garantir que a collation do servidor, do banco e das colunas sejam exatamente as mesmas. Dessa forma, novos bancos irão utilizar a collation do servidor e novas colunas irão utilizar a collation do banco e se a collation do banco for igual a collation do servidor, as novas colunas irão portanto utilizar a collation do servidor. Trocar a collation do banco é bastante simples (basta o comando ALTER DATABASE). Trocar a collation do servidor também é simples (a dificuldade pode ser em conseguir uma janela para indisponbilizar o SQL Server). O grande problema está em trocar a collation das colunas já existentes que não serão alteradas automaticamente. Para uma compreensão completa desses últimos parágrafos, vou exemplificar:

— Verificando a collation do servidor
EXEC sp_helpsort

— Criando um novo banco de dados
— A collation é divergente do servidor

CREATE DATABASE BD COLLATE Latin1_General_CI_AS

— Criando uma nova tabela
— A collation é divergente do banco e do servidor
CREATE TABLE BD..tbl (Nome VARCHAR(80) COLLATE Latin1_General_CS_AS)

— Inserindo registros
INSERT INTO BD..tbl (Nome) VALUES (‘Alguém’)

— Tentando combinar registros com uma tabela temporária
CREATE TABLE #tbl (Nome VARCHAR(80))
INSERT INTO #tbl (Nome) VALUES (‘Ninguém’)

SELECT Nome FROM BD..tbl
UNION ALL
SELECT Nome FROM #tbl

No meu servidor, a collation escolhida foi Latin1-General, case-insensitive, accent-sensitive, … Se observarmos ela difere da collation do banco de dados e ambos divergem da collation da coluna. Como pode-se ver, se for utilizado tabelas temporárias e a collation estiver divergente os problemas de conflito de collation continuam a ocorrer (isso aconteceria mesmo que a collation da coluna e do banco de dados fosse a mesma já que o problema é com o TempDB).

Supondo que a collation do servidor já estivesse correta, precisaríamos então alterar a collation do banco de dados para refletir a nova collation.

— Verificando a collation do banco de dados antes da alteração
SELECT DATABASEPROPERTYEX(‘BD’,‘Collation’)

— Alterando a collation do banco de dados
ALTER DATABASE BD COLLATE Latin1_General_CI_AI

— Verificando a collation do banco de dados após a alteração
SELECT DATABASEPROPERTYEX(‘BD’,‘Collation’)

— Criando uma nova coluna
ALTER TABLE BD..tbl ADD SobreNome VARCHAR(80)

Após essa alteração, saberemos que o banco de dados possuirá a mesma collation que o servidor. Ao criarmos uma nova coluna, essa nova collation será a collation escolhida.

— Verificando as collations da tabela
SELECT TABLE_NAME, COLUMN_NAME, COLLATION_NAME
FROM BD.INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = ‘tbl’

Podemos perceber que a coluna sobrenome já estará com a collation desejada (CI_AI), já que essa é a collation do banco. Toda vez que uma nova coluna for adicionada e sua collation não for definida valerá a collation do banco de dados. O problema está na coluna nome. Como a coluna já existia antes da troca da collation do banco de dados, ela permanece com a collation antiga (CS_AS). A troca da collation do banco de dados não tem efeito sobre colunas já existentes e não foi capaz de alterá-la. Será necessário uma intervenção para alterar a collation desejada. Isso pode ser feito através do SQL Server Management Studio, abrindo-se a estrutura da tabela e efetuando-se a troca. Para uma única coluna, isso é factível, mas e se o banco tivesse dezenas de colunas textuais ? Alterar uma a uma seria impraticável.

Uma das formas de se trocar isso seria a alteração da coluna através de uma instrução de ALTER TABLE. Ex:

— Alterando a collation da coluna Nome
ALTER TABLE BD..tbl ALTER COLUMN Nome VARCHAR(80) COLLATE Latin1_General_CI_AI

O segredo então será então gerar um script que gere todas as instruções de ALTER para todas as colunas textuais e aplicar essas instruções de ALTER. Devemos lembrar que é essencial preservar as características da coluna como tipo de dados, tamanho, nulabilidade, etc. Façamos então um exemplo.

— Declarando uma variável para armazenar a collation do banco
DECLARE @Collation VARCHAR(30)
SET @Collation = CAST((SELECT DATABASEPROPERTYEX(‘BD’,‘Collation’)) AS VARCHAR(30))

— Gerando as instruções de ALTER
— Gerar o ALTER <Tabela> e ALTER COLUMN <Coluna>

SELECT ‘ALTER ‘ + TABLE_NAME + ‘ ALTER COLUMN ‘ + COLUMN_NAME + ‘ ‘ +

— Definir a sintaxe do tipo de dados
CASE
WHEN DATA_TYPE IN (‘Text’,‘NText’) THEN DATA_TYPE
WHEN CHARACTER_MAXIMUM_LENGTH = -1 THEN DATA_TYPE + ‘(MAX)’
ELSE DATA_TYPE + ‘(‘ + CAST(CHARACTER_MAXIMUM_LENGTH AS VARCHAR(4)) + ‘)’

— Especificar a collation
END + ‘ COLLATE ‘ + @Collation + ‘ ‘ +

— Especificar a nulabilidade
CASE IS_NULLABLE WHEN ‘YES’ THEN ‘NULL’ ELSE ‘NOT NULL’ END
FROM BD.Information_Schema.Columns

— Filtrar apenas as colunas textuais
WHERE COLLATION_NAME IS NOT NULL

Ao rodar essa instrução, percebemos que as instruções de ALTER TABLE foram geradas para as colunas textuais do banco de dados.

ALTER TABLE tbl ALTER COLUMN Nome varchar(80) COLLATE Latin1_General_CI_AI NULL
ALTER TABLE tbl ALTER COLUMN SobreNome varchar(80) COLLATE Latin1_General_CI_AI NULL

Basta então copiar as instruções de alteração geradas e aplicá-las. Com esse script é possível criar as instruções de alteração para todas as colunas textuais. Uma vez que as instruções estejam disponíveis, as mesmas podem ser aplicadas e os problemas com collation estariam todos resolvidos. A collation do servidor, do banco e das colunas finalmente estaria a mesma.

É bem verdade que o script pode ajudar nessa tarefa, mas existem situações em que ele sozinho não será suficiente. Se uma coluna textual fizer parte de um índice ou uma constraint (PK, UK, FK, CK ou Default) o script irá falhar. A razão é simples. Se um índice é construído sobre um coluna textual, é normal que sua chave contemple a collation da coluna e ao alterar a coluna é necessário alterar também o índice. Infelizmente não poderemos fazer tudo isso em uma única instrução ALTER. O exemplo abaixo irá falhar pela existência de uma constraint sobre uma coluna textual (mesmo que não haja nenhum registro).

— Cria a tabela
CREATE TABLE BD..Estados (UF CHAR(2) COLLATE Latin1_General_CI_AS NOT NULL)

— Cria uma chave primária
ALTER TABLE BD..Estados ADD CONSTRAINT PK_Estado PRIMARY KEY (UF)

— Tenta alterar a collation
ALTER TABLE BD..Estados ALTER COLUMN UF CHAR(2) COLLATE Latin1_General_CI_AI NOT NULL

Normalmente colunas textuais não são escolhidas para chave primárias, mas fatalmente haverá alguma constraint ou índice sobre essas colunas. Então o que pode ser feito é usar o script apresentado para gerar todas as instruções de alteração e as que não funcionarem, uma intervenção manual deverá ser realizada. Se houver poucas colunas com índices e constraints, ficará fácil fazer a intervenção manual. Se houver muitas colunas com índices e constraints, então sim, trocar a collation será bem dispendioso (pode ser mais interessante criar um banco do zero e exportar os dados).

Esse artigo mostra que é possível alterar a collation, mas mostra também o quão importante é definí-la adequadamente. Muitas vezes essa opção é esquecida (principalmente para usuários do tipo NEXT, NEXT, NEXT, FINISH). Se você irá trabalhar com softwares de terceiros, lembre-se de acordar previamente com o seu fornecedor qual será a collation utilizada, para que após o produto estar em produção, você não tenha que alterar a collation de uma solução de terceiros.

Aos mais curiosos, o SQL Server mapeia a relação das constraints e índices em algumas tabelas como sys.check_constraints, sys.foreing_keys, etc. Se for o caso, pode-se evoluir o script para gerar apenas as alterações que não irão ter problemas relacionadosa constraints e índices e depois contabilizar as que irão gerar problemas dessa natureza. Fica aí o desafio de evoluir esse script.

[ ]s,

Gustavo

46 Respostas para “Como resolver problemas relacionados a conflitos de Collation

  1. Perfeito, Realmente o artigo ficou muito completo e esclareceu todas as minhas dúvidas por completo. Tendo participação fundamental na resolução do meu problema. Muito Obrigado!

  2. Cara, perfeito mesmo, tirou muitas duvidas minhas, ainda mas sendo eu um perfeito leigo no assunto.vlw

  3. Parabéns cara, esse artigo foi 100% útil, te garanto que muita gente que trabalha com banco de dados SQL Server apanha com isso.

  4. Olá Josecelmo,Os constantes problemas de collation que passamos no dia a dia foram a maior motivação para escrever esse artigo. Que bom que ele foi útil a você e aos demais.Abs,

  5. Ageu Brito de

    Olá Gustavo, li sua materia e achei muito interessante, gostaria de fazer uma pergunte para voce. Se existem collations diferentes usando o UNICODE, esses problemas de conflitos seriam resolvidos?Grande abraço.Ageu Brito de Almeida.

  6. Oi Ageu,Entendo que na teoria deveria ser assim, mas infelizmente não. Mesmo usando o UNICODE, haverá problemas caso as collations não sejam as mesmas. O que mudará é apenas a mensagem de erro quando se usa Unicode.[ ]s,

  7. Marcelo@@ Mendes

    Excelente matéria.

    É muito bom saber que existem pessoas que se dispoem a desvendar esses mistérios de forma simples, objetiva e entendível.

    As vezes temos alguns DBAs do nosso lado, que simplesmente querem reter o conhecimento para si. Mas o bom que existem pessoas como você Gustavo!

    Grande abraço

    • Oi Marcelo,

      Que bom que o artigo pode ajudá-lo. Já vi alguns DBAs que retem conhecimento, mas ao meu ver isso não leva a nada. Hoje em dia a informação é muito acessível. Se alguém retê-la para si, você acabará descobrindo-a de outra forma. Somente quando se compartilha o conhecimento é que ele realmente tem condições de evoluir. Aqueles que retem conhecimento acabam evoluindo mais devagar, pois, não usufruem de outros pontos de vista.

      Abs,

  8. Cara… muito bom!! Tá de parabéns!

  9. Fabio Rosário

    Gustavo Boa Tarde

    Muito bom esse artigo, espero lhe ajudar futuramente compartilhando conhecimentos

    abraços

  10. Parabéns Gustavo.

    Otimo artigo.

  11. Fábio

    agradeço muito a sua ajuda, resolveu o meu problema aqui.
    Que Deus te abençoe grandemente.

  12. Muito bom o post! Parabéns!

  13. Pingback: DATEDIFF, CONVERT, SUBSTRING e funções sobre colunas na cláusula WHERE e JOINs | Gustavo Maia Aguiar

  14. Flávio Jacinto

    Oi Gustavao!!
    Gostei muito. Claro e simples como deve ser. Estar me ajudando nos meus estudos.
    Um abraço.
    Flávio Jacinto

  15. Clodoaldo Gouveia

    Excelente artigo Gustavo. De grande ajuda.

    Muito obrigado!!!

  16. Flávio Jacinto

    Fala Gustavo!!
    Mas uma vez parabenizo por dividir seus conhecimentos com agente. Aproveito para incentivar os arquivos no youtube. Estou curtindo muito, tanto os seus, como dos outros colegas.
    Um abraço.
    Flávio Jacinto

  17. Artigo de utilidade pública, valeu e parabens!

  18. Dárcio Pereira Dias

    Magnífica explicação!
    Principalmente para alguém como eu que sou leigo no assunto.
    Adorei, não só porque há a solução para o problema do conflito de collate, mas principalmente pela explanação da origem, do pôr que, do problema.

    Muito obrigado.

  19. Primeiramente, seu artigo é o melhor que eu já li sobre o assunto. Parabéns. Em segundo lugar, eu tenho a seguinte situação: várias funções que retornam dados do tipo tabela. Os campos foram definidos sem o collate, portanto usam o default do banco. Quando eu rodo o script que você sugere retorna a seguinte mensagem: The column ‘FUNCAO.COLUNA’ is dependent on database collation. Preciso entrar função por função para definir o collate ou existe uma forma mais ágil?.

    • Olá Valter,

      Obrigado pelo elogio. Procurei ser o mais completo possível, pois, tem muita gente que sobre com esse problema. No seu caso específicio será preciso entrar função a função para corrigir. Uma forma de fazê-lo é gerar o scripts de todas as funções e reaplicar no banco. Quando você fizer isso, as funções serão recriadas com a nova collation.

      [ ]s,

      Gustavo

  20. Nossa, muito bom o post. Só uma dúvida, Gustavo. No meu caso, o collate default da minha máquina é o 1252, porém o que gerou arquivo era o 850. Então quando importo o arquivo ocorre erro na decodificação. Alguma sugestão de como posso alterar isso direto da importação na carga do SSIS?

    • Olá PumpeerKin,

      Eu não me deparei com uma situação dessas, mas acredito que se você fizer uma conversão para Unicode durante o pacote, talvez resolva.

      [ ]s,

      Gustavo

      • PumpeerKin

        Já verifiquei esse procedimento dentro do pacote. Porém, o unicode não valida a informação. Ele permanece o mesmo collate e gera um erro. Então para validar esse informação, fiz a conversão no próprio banco. Mas acredito que o procedimento deva sim ter uma forma de realizar durante o ETL. Obrigada desde já.

  21. O Script dá erro pois existem indices em alguns campos, como resolver ? sem ter que apagar os indices e refazer …

    • Boa Noite,

      Infelizmente é necessário dropar os índices e constraints para o script funcionar. Normalmente colunas textuais não são boas candidatas para índices e por isso o script funciona em muitos casos. O que eu sugiro é que se os índices não estiverem envolvidos em constraints, que você recrie-os. Opcionalmente se forem poucos, acredito ser possível resolver pelo SSMS.

      [ ]s,

      Gustavo

  22. Gustavo, muito bom o artigo…
    Um aviso: atualize o link para a referencia do artigo no imasters.
    o link ativo é o seguinte :

    http://imasters.com.br/artigo/262

  23. Muito bom artigo, Gustavo!
    Me ajudou bastante!

  24. Fernando Ferreira

    Existe algum software que eu consiga varrer uma base de dados e aplicar uma determinada collation?
    Estou com esse problema em várias tabelas

  25. Natalia Castro

    Ajudou muito, cara! Brigadão :D

  26. Pingback: SQL Server-Como resolver problemas relacionados a conflitos de Collation | ..::invisible flame light::..

  27. Ivan Martinez

    Parabéns pelo artigo.É díficil hoje em dia encontrar na WEB informações confiáveis, e escritas de maneira didática, com ocorreu neste artigo.

Deixe uma resposta

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s