Partilhar via


Definir ou alterar o agrupamento de colunas

Aplica-se a:SQL ServerBanco de Dados SQL do AzureInstância Gerenciada SQL do Azure

Você pode substituir o agrupamento de dados do banco de dados para char , varchar , texto , nchar , nvarchar e ntext especificando um agrupamento diferente para uma coluna específica de uma tabela e usando um dos seguintes:

  • A cláusula COLLATE de CREATE TABLE e ALTER TABLE, como visto nos exemplos abaixo.

    • Conversão no local. Considere uma das tabelas existentes definidas abaixo:

      -- NVARCHAR column is encoded in UTF-16 because a supplementary character enabled collation is used
      CREATE TABLE dbo.MyTable (CharCol NVARCHAR(50) COLLATE Latin1_General_100_CI_AI_SC);
      
      -- VARCHAR column is encoded the Latin code page and therefore is not Unicode capable
      CREATE TABLE dbo.MyTable (CharCol VARCHAR(50) COLLATE Latin1_General_100_CI_AI);
      

      Para converter a coluna diretamente para usar UTF-8, execute uma instrução ALTER COLUMN que defina o tipo de dados necessário e um agrupamento compatível com UTF-8.

      ALTER TABLE dbo.MyTable 
      ALTER COLUMN CharCol VARCHAR(50) COLLATE Latin1_General_100_CI_AI_SC_UTF8
      

      Este método é fácil de implementar, no entanto, é uma operação de bloqueio possível que pode se tornar um problema para tabelas grandes e aplicativos ocupados.

    • Copie e substitua. Considere uma das tabelas existentes definidas abaixo:

      -- NVARCHAR column is encoded in UTF-16 because a supplementary character enabled collation is used
      CREATE TABLE dbo.MyTable (CharCol NVARCHAR(50) COLLATE Latin1_General_100_CI_AI_SC);
      GO
      
      -- VARCHAR column is encoded using the Latin code page and therefore is not Unicode capable
      CREATE TABLE dbo.MyTable (CharCol VARCHAR(50) COLLATE Latin1_General_100_CI_AI);
      GO
      

      Para converter a coluna para usar UTF-8, copie os dados para uma nova tabela onde a coluna de destino já é o tipo de dados necessário e um agrupamento habilitado para UTF-8 e, em seguida, substitua a tabela antiga:

      CREATE TABLE dbo.MyTableNew (CharCol VARCHAR(50) COLLATE Latin1_General_100_CI_AI_SC_UTF8);
      GO
      INSERT INTO dbo.MyTableNew 
      SELECT * FROM dbo.MyTable;
      GO
      DROP TABLE dbo.MyTable;
      GO
      EXEC sp_rename 'dbo.MyTableNew', 'dbo.MyTable';
      GO
      

      Este método é muito mais rápido do que a conversão no local, mas lidar com esquemas complexos com muitas dependências (FKs, PKs, triggers, DFs) e sincronizar o final da tabela (se o banco de dados estiver em uso) requer mais planeamento.

    Para obter mais informações, consulte Collation and Unicode Support.

  • SQL Server Management Studio. Para obter mais informações, consulte Modificar colunas (Mecanismo de Banco de Dados).

  • Usando a propriedade Column.Collation no SQL Server Management Objects (SMO).

Não é possível alterar o agrupamento de uma coluna atualmente referenciada por qualquer um dos seguintes:

  • Uma coluna computada
  • Um índice
  • Estatísticas de distribuição, geradas automaticamente ou pela declaração CREATE STATISTICS
  • Uma restrição CHECK (de verificação)
  • Uma restrição de chave estrangeira

Quando se trabalha com tempdb, a cláusula COLLATE inclui uma opção database_default para especificar que uma coluna em uma tabela temporária utilize o padrão de agrupamento do banco de dados do utilizador atual para a conexão, em vez do agrupamento de tempdb.

Agrupamentos e colunas de texto

Você pode inserir ou atualizar valores em uma coluna de texto cujo agrupamento é diferente da página de códigos do agrupamento padrão do banco de dados. O SQL Server converte implicitamente os valores para o agrupamento da coluna.

Colações e tempdb

O banco de dados tempdb é criado sempre que o SQL Server é iniciado e tem o mesmo agrupamento padrão que o modelo banco de dados. Isso geralmente é o mesmo que o agrupamento padrão da instância. Se você criar um banco de dados de usuário e especificar um agrupamento padrão diferente de modelo, o banco de dados de usuário terá um agrupamento padrão diferente de tempdb. Todos os procedimentos armazenados temporários ou tabelas temporárias são criados e armazenados em tempdb. Isso significa que todas as colunas implícitas em tabelas temporárias e todas as constantes, variáveis e parâmetros padrão coercitivo em procedimentos armazenados temporários têm agrupamentos diferentes de objetos comparáveis criados em tabelas permanentes e procedimentos armazenados.

Isso pode levar a problemas com uma incompatibilidade de agrupamentos entre bancos de dados definidos pelo usuário e objetos de banco de dados do sistema. Por exemplo, uma instância do SQL Server usa o agrupamento de Latin1_General_CS_AS e você executa as seguintes instruções:

CREATE DATABASE TestDB COLLATE Estonian_CS_AS;  
USE TestDB;  
CREATE TABLE TestPermTab (PrimaryKey int PRIMARY KEY, Col1 nchar );  

Neste sistema, o banco de dados tempdb usa o agrupamento Latin1_General_CS_AS com página de código 1252 e TestDB e TestPermTab.Col1 usam o agrupamento Estonian_CS_AS com página de código 1257. Por exemplo:

USE TestDB;  
GO  
-- Create a temporary table with the same column declarations  
-- as TestPermTab  
CREATE TABLE #TestTempTab (PrimaryKey int PRIMARY KEY, Col1 nchar );  
INSERT INTO #TestTempTab  
         SELECT * FROM TestPermTab;  
GO  

Com o exemplo anterior, o banco de dados tempdb usa o agrupamento Latin1_General_CS_AS e TestDB e TestTab.Col1 usam o agrupamento Estonian_CS_AS. Por exemplo:

SELECT * FROM TestPermTab AS a INNER JOIN #TestTempTab on a.Col1 = #TestTempTab.Col1;  

Como tempdb usa o agrupamento de servidor padrão e TestPermTab.Col1 usa um agrupamento diferente, o SQL Server retorna este erro: "Não é possível resolver o conflito de agrupamento entre 'Latin1_General_CI_AS_KS_WS' e 'Estonian_CS_AS' na operação de igualdade."

Para evitar o erro, você pode usar uma das seguintes alternativas:

  • Especifique que a coluna da tabela temporária use o agrupamento padrão do banco de dados do usuário, não tempdb. Isso permite que a tabela temporária trabalhe com tabelas formatadas de forma semelhante em vários bancos de dados, se isso for exigido do seu sistema.

    CREATE TABLE #TestTempTab  
       (PrimaryKey int PRIMARY KEY,  
        Col1 nchar COLLATE database_default  
       );  
    
  • Especifique o agrupamento correto para a coluna #TestTempTab:

    CREATE TABLE #TestTempTab  
       (PrimaryKey int PRIMARY KEY,  
        Col1 nchar COLLATE Estonian_CS_AS  
       );  
    

Ver também

Definir ou alterar o agrupamento do servidor
Definir ou alterar o agrupamento de banco de dados
Suporte a Agrupamento e Unicode