Como faço para alterar o agrupamento de um banco de dados do SQL Server?

16

Estou tentando padronizar todos os bancos de dados em um único agrupamento - Latin1_General_CI_AS (o agrupamento padrão). Eu tenho alguns bancos de dados que estão em SQL_Latin1_General_CP1_CI_AS.

Eu sei que posso usar ALTER DATABASE para alterar o agrupamento do banco de dados, mas isso afeta apenas novos objetos. Meu entendimento é que a única maneira de alterar as colunas existentes é fazer ALTER COLUMN em cada coluna em cada tabela - e eu precisaria descartar e recriar todos os índices para fazer isso mesmo.

Eu acho que seria algo parecido com isto:

DROP INDEX indexname ON tablename

GO

ALTER TABLE tablename ALTER COLUMN columname varchar(50) COLLATE Latin1_General_CI_AS NULL

GO

CREATE CLUSTERED INDEX indexname ON tablename (columname ASC)

e repita para cada coluna varchar, char, text, nvarchar, nchar e ntext em todo o banco de dados. Isso seria um script SQL enorme .

Existe uma maneira mais fácil de fazer isso, ou alguém pode sugerir uma maneira de automatizar a criação de um script SQL para fazer isso?

    
por Richard Gadsden 04.06.2009 / 12:36

6 respostas

9

MS KB 325335 tem opções sobre como fazer isso para todo o banco de dados e todas as colunas.

Basicamente:

  1. Tabelas de banco de dados de script (com novo agrupamento)
  2. Dados DTS / SSIS (assistindo agrupamento)
  3. Adicionar restrições
por 04.06.2009 / 12:42
3

Pode precisar de alguns ajustes, mas tive sucesso usando o utilitário "SQL Server 2000 Collation Changer": link

    
por 04.06.2009 / 17:41
2

Infelizmente, essa não é uma tarefa fácil no SQL Server.

Você pode usar uma ferramenta de script como o SQL Compare do Redgate para seu objetos de banco de dados existentes (tabelas, procedimentos armazenados, visualizações, etc.) Se você não tiver uma licença, poderá usar a avaliação gratuita. Depois de criar o novo banco de dados com o agrupamento correto e reconstruir os objetos do seu script, você pode executar o SSIS para transferir dados de um banco de dados para outro. Se você tiver muitos dados, use a inserção em massa do T-SQL.

Por ter o agrupamento correto para futuros bancos de dados nesse servidor, você poderia alterar o agrupamento padrão no servidor. O seguinte artigo MSDN explica quais alterações usando as cláusulas COLLATE de ALTER DATABASE e ALTER TABLE:

Definindo e alterando o agrupamento de bancos de dados (Manuais Online do SQL Server 2008)

You can change the collation of any new objects that are created in a user database by using the COLLATE clause of the ALTER DATABASE statement. This statement does not change the collation of the columns in any existing user-defined tables. These can be changed by using the COLLATE clause of ALTER TABLE.

When you change the database collation, you change the following:

  • The default collation for the database. This new default collation is applied to all columns, user-defined data types, variables, and parameters subsequently created in the database. It is also used when resolving the object identifiers specified in SQL statements against the objects defined in the database.
  • Any char, varchar, text, nchar, nvarchar, or ntext columns in system tables are changed to the new collation.
  • All existing char, varchar, text, nchar, nvarchar, or ntext parameters and scalar return values for stored procedures and user-defined functions are changed to the new collation.
  • The char, varchar, text, nchar, nvarchar, or ntext system data types, and all user-defined data types based on these system data types, are changed to the new default collation.
    
por 04.06.2009 / 15:26
1

Geralmente, não é recomendável fazer isso em um servidor ativo. A última vez que eu olhei, fazendo isso não foi oficialmente suportado pela Microsoft. Para fazer isso na prática, você precisa criar uma nova instância com o agrupamento correto e migrar o banco de dados para ela.

A restauração de um banco de dados com um servidor com um agrupamento padrão diferente causa todo tipo de diversão, pois o tempdb terá o agrupamento do novo servidor, portanto, isso também não é recomendado.

    
por 04.06.2009 / 15:40
1

Tente este utilitário , que dado um banco de dados de origem irá gerar todos os scripts necessários para ser aplicado em um banco de dados de destino para que o agrupamento seja alterado com segurança.

    
por 16.09.2012 / 20:27
1

Você pode usar as visualizações Infomation_Schema para gerar um script com facilidade, mas não tenho certeza de que essa é a melhor maneira de resolver seu problema. Recriar todos os índices em um banco de dados largish poderia levar uma quantidade enorme de tempo / espaço de log, etc. Eu iria migrar (não restaurar) para uma nova instância.

    
por 04.06.2009 / 15:55