Como alterar o agrupamento do SQL Server


27

Como eu poderia alterar o agrupamento padrão do SQL Server 2008 R2 Express para todo o servidor e um banco de dados específico?

Existe uma maneira de fazer isso usando a interface visual do SQL Server Management Studio? Na janela Propriedades do servidor (e na janela Propriedades do banco de dados correspondente), essa propriedade não está disponível para edição.


2
Se você deseja alterar o agrupamento de todas as colunas no banco de dados, observe este script . Eu não tentei, mas encontrei para um colega de trabalho que estava procurando fazer exatamente isso.
Justin Dearing

2
Se você deseja alterar o agrupamento de um banco de dados, confira esta ferramenta: codeproject.com/KB/database/ChangeCollation.aspx Ele funciona com o SQL Server 2005 e 2008 e funcionou melhor para mim do que os scripts que você pode encontrar no diretório rede.
Erwin

Respostas:


25

Sim.

Você pode alterar o agrupamento padrão da instância expressa do SQL Server 2008 R2 e dos bancos de dados individuais, mas é uma tarefa complexa.

Infelizmente, não há opção visual para fazê-lo via SSMS.

O SQL Server 2008 oferece suporte à configuração de agrupamentos nos seguintes níveis:

  • Servidor

  • Base de dados

  • Coluna

  • Expressão

As configurações de instalação padrão são determinadas pelo código do idioma do sistema Windows. O agrupamento no nível do servidor pode ser alterado durante a instalação ou alterando o código do idioma do sistema Windows antes da instalação. Mais...

Definindo e alterando o agrupamento de servidores - SQL Server 2008

  • Verifique se você possui todas as informações ou scripts necessários para recriar seus bancos de dados de usuários e todos os objetos neles.

  • Exporte todos os seus dados usando uma ferramenta como o utilitário bcp. Para obter mais informações, consulte Importando e exportando dados em massa.

  • Solte todos os bancos de dados do usuário.

  • Recrie o banco de dados mestre especificando o novo agrupamento na propriedade SQLCOLLATION do comando setup

  • Crie todos os bancos de dados e todos os objetos neles.

  • Importe todos os seus dados.

Definindo e alterando o agrupamento de banco de dados - SQL Server 2008

  • Defina a COLLATIONopção na CREATE DATABASEinstrução ao criar um novo banco de dados.
  • Da mesma forma, defina as COLLATIONopções na ALTER DATABASEinstrução para alterar o agrupamento de um banco de dados existente.

    ALTER DATABASE [database_name] COLLATE SQL_Latin1_General_CP1_CI_AS;

Definindo e alterando o agrupamento de colunas

  • Alguns dos agrupamentos de colunas permanecerão os mesmos, mesmo após a alteração do agrupamento do banco de dados. Nesse caso, você deve modificar o agrupamento das colunas individuais.

6

Certifique-se de que realmente deseja "descartar" os bancos de dados do usuário, conforme observado na resposta acima. Você pode apenas querer "desanexar" os bancos de dados. Ou, na verdade, você não pode fazer nada, pois a reconstrução do mestre remove efetivamente quaisquer links para os bancos de dados do usuário. Há momentos em que os bancos de dados são criados no agrupamento desejado, mas o servidor não. Você não gostaria de recuperar todos os seus bancos de dados de usuários de backups neste caso.


5

Fiz algo assim e funcionou, mas você deve ter em mente que os índices que apontam para o tipo de dados, como texto / varchar / nvarchar, devem ser eliminados, executar o script e criar os índices.

USE YourDataBase
GO

DECLARE @Table_Name NVARCHAR(100)
SET @Table_Name = NULL--- THIS IS THE TableName that you want to change its collation columns

--- if null will set to all tables

DECLARE @TempTable AS TABLE
(
ID INT IDENTITY
,TableName NVARCHAR(100)
,ColumnName NVARCHAR(100)
,TypeName NVARCHAR(100)
,Max_length INT
,Collation_Name NVARCHAR(100)
,EnterDtm DATETIME DEFAULT GETDATE()
)
DECLARE @NewCollation NVARCHAR(100)
SET @NewCollation = 'Latin1_General_CI_AS' --- THIS IS THE COLLATION NAME THAT YOU WANT TO CHANGE

INSERT INTO @TempTable(TableName,ColumnName,TypeName,Max_length,Collation_Name)
SELECT 
QUOTENAME(SCHEMA_NAME(tables.schema_id)) + '.' + QUOTENAME(tables.name) AS TableName
,all_columns.name AS ColumnName
,type_name(all_columns.user_type_id)
,all_columns.max_length
,all_columns.collation_name  
from sys.all_columns INNER JOIN sys.tables ON
tables.object_id = all_columns.object_id
AND collation_name IS NOT NULL
AND all_columns.collation_name != @NewCollation
WHERE tables.object_id = ISNULL(object_id(@Table_Name),all_columns.object_id)


DECLARE @TableID SMALLINT
SET @TableID = (SELECT MIN(ID) FROM @TempTable)

DECLARE @Query NVARCHAR(1000),@TableName NVARCHAR(100),@ColumnName NVARCHAR(100),@TypeName NVARCHAR(100)
,@Size INT

WHILE @TableID IS NOT NULL
BEGIN
    SET @TableName = (SELECT TableName FROM @TempTable WHERE ID = @TableID)
    SET @ColumnName = (SELECT QUOTENAME(ColumnName) FROM @TempTable WHERE ID = @TableID)
    SET @TypeName = (SELECT TypeName FROM @TempTable WHERE ID = @TableID)
    SET @Size = (SELECT Max_length FROM @TempTable WHERE ID = @TableID) 

    SET @Query='ALTER TABLE ' + @TableName + ' ALTER COLUMN ' + @ColumnName + ' ' + @TypeName+ ISNULL ('(' +CAST(@Size AS VARCHAR(200))+')', '') +' COLLATE '+ @NewCollation  
    PRINT (@Query)

    SET @TableID = (SELECT MIN(ID) FROM @TempTable WHERE ID > @TableID)
END 

esta é a minha primeira resposta postada perdão minha bagunça


-1

Exportar todos os dados (incluindo logins, servidores vinculados, tarefas do SQL Agent, configurações do DB Mail, etc.) e reconstruir os dados no nível da instância, além de recarregar todos os dados do usuário, é muito trabalhoso. E, mesmo depois de tudo isso, ainda não há garantia de que você possa atualizar o agrupamento padrão de um banco de dados, ALTER DATABASEpois existem várias condições que impedirão a conclusão da operação (consulte a seção "Alterando oALTER DATABASE agrupamento do banco de dados" da documentação para obter detalhes) .

Há, no entanto, um método não documentado que é muito mais fácil. A principal desvantagem é que não há suporte. Isso não quer dizer que algo dê errado, apenas que, se algo acontecer, a Microsoft não ajudará a corrigi-lo (porque eles nunca garantiram que funcionaria).

O método de que falo está sendo executado sqlservr.execom o -q {new_collation_name}switch. Há um pouco mais do que isso, mas essa é a idéia básica. Este método simplesmente atualiza os metadados do sistema, que traz benefícios e consequências, sendo os principais:

BENEFÍCIOS

  • muito rápido
  • ignorar a maioria das restrições que impedem o ALTER DATABASEtrabalho
  • provavelmente muito mais preciso do que qualquer script criado pelas pessoas ao longo dos anos para descartar e recriar objetos

DRAWBACKS

  • não é suportado se algo der errado
  • VARCHARos dados podem mudar, SE a página de código for diferente entre os agrupamentos antigos e novos e existirem caracteres com valores de 128 a 255 (0x80 - 0xFF) e esses caracteres não existirem como o mesmo caractere com o mesmo valor no novo código página. Portanto, existe o potencial de perda de dados, e seus dados precisam ser pesquisados ​​primeiro para garantir que essa condição não exista. Porém, isso também significa que há muitos casos com apenas caracteres com valores de 0 a 127 que não correm risco, mesmo que a página de códigos seja alterada.
  • Os tipos de tabela definidos pelo usuário (UDTTs) são ignorados e precisam ser atualizados manualmente.

Para obter uma descrição detalhada do que o sqlservr.exe -qmétodo faz e o que não faz (incluindo detalhes sobre como os agrupamentos funcionam nos vários níveis e possíveis problemas a serem observados), consulte meu post:

Alterando o agrupamento da instância, dos bancos de dados e de todas as colunas em todos os bancos de dados do usuário: o que pode dar errado?

Para alterar apenas a instância (incluindo os bancos de dados do sistema: master, model, msdb, e tempdb) e um ou mais bancos de dados (mas não todos os bancos de dados), simplesmente desanexar o banco de dados (s) que deseja excluir esta operação, e então re-anexá-los assim que a atualização do agrupamento for concluída.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.