Copiando dados entre agrupamentos diferentes

No Microsoft SQL Server os dados podem ser movidos de modo homogêneo entre colunas Unicode e a conversão é desnecessária. Dados movidos entre colunas que contêm dados de caracteres não Unicode, no entanto, devem ser convertidos da página de código-fonte para a página de código de destino. Uma página de código é um conjunto ordenado de caracteres de um determinado script no qual um índice numérico ou valor de ponto de código é associado a cada caractere. Páginas de código oferecem suporte a conjuntos de caracteres e layouts de teclado usados por diferentes localidades do Microsoft Windows. Para uma lista das páginas de código com suporte, consulte Arquitetura de página de código.

Por padrão, dados de caracteres são convertidos da seguinte maneira:

Operação

Dados de caracteres convertidos em:

Exportar

Caracteres de página de código OEM

Importar

Caracteres de página de código ANSI/Microsoft Windows

Conversão entre páginas de código OEM e ANSI causam a perda de caracteres DBCS (conjunto de caracteres byte duplo) ou estendidos. Para evitar tais conversões no SQL Server, é possível especificar uma página de código ou um agrupamento.

ObservaçãoObservação

Para obter informações sobre como transferir um banco de dados de um agrupamento para outro, consulte este site da Microsoft.

No SQL Server 7.0 e versões posteriores, o armazenamento físico de cadeias de caracteres é controlado por agrupamentos. A configuração de agrupamentos oferece suporte em quatro níveis: a instância de servidor, um banco de dados, uma coluna de tabela e uma expressão. Um agrupamento especifica três propriedades:

  • A página de código usada para armazenar dados de caracteres não Unicode.

  • A ordem de classificação a ser usada para tipos de dados Unicode (nchar, nvarchare ntext). Uma ordem de classificação define a sequência na qual os caracteres são classificados e o modo pelo qual são avaliados em operações de comparação.

  • A ordem de classificação para usar em tipos de dados de caracteres não Unicode (char, varchar e text).

ObservaçãoObservação

O Microsoft recomenda que você especifique um nome de agrupamento para cada coluna em um arquivo de formato.

Para uma introdução a páginas de código e agrupamentos, consulte Suporte a agrupamentos e a Unicode. Para obter informações detalhadas, consulte Trabalhando com agrupamentos.

Usando um agrupamento em nível de coluna

No SQL Server 7.0 e versões posteriores, é possível controlar a conversão de dados especificando o agrupamento no qual os dados são armazenados no campo do arquivo de dados de destino para uma exportação em massa, ou na coluna da tabela de destino, para uma operação de importação em massa. Qualquer conversão exigida entre o agrupamento de arquivo de dados e os agrupamentos de colunas de tabela no banco de dados é executada internamente pela operação de importação ou de exportação.

ObservaçãoObservação

Para SQL Server 7.0 e versões posteriores, há suporte para especificar uma página de código, mas é preferível especificar o agrupamento em um arquivo de formato.

Agrupamentos sempre se aplicam a colunas SQLCHAR em operações de exportação e importação em massa. As especificações de agrupamento de colunas são sempre ignoradas nas colunas que não têm SQLCHAR ou SQLNCHAR especificado como tipo de dados de host. Os agrupamentos são usados para determinar a ordem de classificação de colunas SQLCHAR e SQLNCHAR durante operações de importação em massa para as quais as colunas são referenciadas na dica ORDER.

Para especificar o agrupamento, você deve usar um arquivo de formato. Ambos os tipos de arquivos de formato oferecem suporte a especificação de agrupamentos em nível de coluna. Para obter informações sobre como usar agrupamentos em arquivos de formato não XML, consulte a seção Especificando agrupamentos em nível de coluna em arquivos de formato não XML. Para obter informações sobre como usar agrupamentos em arquivos de formato XML, consulte Compreendendo arquivos no formato XML.

Especificando agrupamentos em nível de coluna em arquivos de formato não XML

A coluna final em um arquivo de formato XML (a coluna em posição 8 ordinal) contém uma especificação de agrupamento que define como os dados são armazenados para aquela coluna no arquivo de dados. As opções da coluna de agrupamento são:

Opção

Descrição

name

Especifica o nome do agrupamento usado para armazenar os dados no arquivo de dados. Para uma lista dos nomes de agrupamentos SQL, consulte Nome de agrupamento do SQL Server (Transact-SQL).

RAW

Especifica que os dados são armazenados na página de código especificada em uma opção de página de código no comando ou na dica BCPFILECP bcp_control. Se nenhum desses for especificado, o agrupamento do arquivo de dados será o da página de código OEM do computador cliente.

ObservaçãoObservação
Para obter mais informações sobre as opções de página de código, consulte "Usando uma página de código", posteriormente neste tópico. Para obter mais informações sobre a dica BCOFILECP, consulte bcp_control.

""

Tem o mesmo significado que RAW.

Exemplos

O exemplo a seguir mostra um arquivo de formato não XML com agrupamentos de coluna especificados para os campos 2 e 3. As informações de agrupamento são exibidas em negrito.

9.0
4
1       SQLCHAR       0       7       "\t"     1     DepartmentID     ""
2       SQLCHAR       0       100     "\t"     2     Name             SQL_Latin1_General_CP1_CI_AS
3       SQLCHAR       0       100     "\t"     3     GroupName        SQL_Latin1_General_CP1_CI_AS
4       SQLCHAR       0       24      "\r\n"   4     ModifiedDate     ""
ObservaçãoObservação

O arquivo de formato precedente é para a tabela HumanResources.Department no banco de dados de exemplo do AdventureWorks2008R2 que tem quatro colunas: DepartmentID, Name, GroupName e ModifiedDate.

Para obter mais informações sobre arquivos de formato não XML, consulte Compreendendo arquivos de formato não XML.

Usando uma página de código

ObservaçãoObservação

Para controlar a conversão de dados, o Microsoft recomenda o uso de um arquivo de formato para especificar agrupamentos em nível de coluna para uma operação de importação ou exportação em massa. Para obter mais informações, consulte. "Usando um agrupamento em nível de coluna", anteriormente nesta seção.

A sintaxe para especificar uma página de código é como segue:

  • Para especificar uma página de código em um comando bcp, use a opção -C:

    -C { ACP | OEM | RAW | code_page }

  • Para especificar uma página de código em uma instrução BULK INSERT ou INSERT... SELECT * FROM OPENROWSET(BULK...) instrução, use a opção CODEPAGE.

    CODEPAGE = { 'ACP' | 'OEM' | 'RAW' | 'code_page' }

Ambas, a opção -C e a opção CODEPAGE, aceitam os valores a seguir para a página de código.

Valor de página de código

Descrição

ACP

Durante uma operação de importação, especifique que os campos de dados dos tipos de dados char, varchar ou text sejam convertidos da página de código do ANSI/Windows (ISO 1252) para a página de código do SQL Server.

Durante uma operação de exportação, especifique que bcp converta essas colunas da página de código do SQL Server para a página de código do ANSI/Windows.

OEM (padrão)

Durante uma operação de importação, especifique que os campos de dados dos tipos de dados char, varchar ou text sejam convertidos da página de código OEM do sistema para a página de código do SQL Server.

Durante uma operação de exportação, especifique que bcp converta essas colunas da página de código do SQL Server para a página de código de OEM do sistema.

RAW

Não ocorre nenhuma conversão de uma página de código para outra. Esta é a opção mais rápida.

code_page

Um número de página de código específico (por exemplo, 850). Para obter uma lista de páginas de código com suporte, consulte Arquitetura de página de código.

Exemplos

Os exemplos a seguir usam a tabela HumanResources.myTeam no banco de dados AdventureWorks2008R2. Antes de executar os exemplos, é necessário criar essa tabela. Para obter informações sobre a tabela e como criá-la, consulte Criando a tabela HumanResources.myTeam.

ObservaçãoObservação

Antes de testar o exemplo seguinte, você deve excluir as linhas existentes da tabela myTeam para evitar conflitos de chave primária.

A. Usando uma página de código com bcp

Este exemplo usa bcp para exportar em massa os dados da tabela HumanResources.myTeam no banco de dados AdventureWorks2008R2 para o arquivo de dados myTeam850.txt, usando a página de código 850. No prompt de comando do Windows, digite:

bcp AdventureWorks2008R2.HumanResources.myTeam out myTeam850.txt -c -C850 -T

B. Usando uma página de código com BULK INSERT

Este exemplo usa BULK INSERT para importar em massa myTeam850.txt, criado no exemplo bcp precedente, na tabela AdventureWorks2008R2 HumanResources.myTeam.

De uma ferramenta de consulta, como o Editor de Consultas do SQL Server Management Studio, execute:

USE AdventureWorks2008R2;
GO
DELETE HumanResources.myTeam;
GO
BULK INSERT HumanResources.myTeam 
   FROM 'C:\myTeam850.txt'
   WITH (CODEPAGE = 850);
GO

Exportando dados em massa entre agrupamentos diferentes

Em uma operação da exportação em massa, a especificação do agrupamento controla a página de código usada para armazenar dados de caracteres no arquivo de dados. Isso se aplica a:

  • Todas as colunas em um arquivo de dados de formato de caractere.

  • Qualquer coluna em um arquivo de modo nativo onde SQLCHAR é especificado como o tipo de dados de arquivo host.

  • Caracteres SQLCHAR cujos valores são maiores que 127 ou menores que 32.

    Os agrupamentos são aplicados a caracteres cujos valores vão de 32 a 127, mas todas as páginas de código mapeiam os mesmos caracteres para os valores de 32 a 127 portanto, a aplicação de agrupamentos diferentes não tem nenhum efeito.

As regras para determinar os agrupamento ou páginas de código usados em uma operação de exportação em massa são:

  • Se um agrupamento de coluna for especificado em um arquivo de formato ou usando a função ODBC bcp_setcolfmt (bcp_setcolfmt), os dados de caracteres serão armazenados usando a página de código ANSI associada ao agrupamento.

  • Se um agrupamento de coluna não foi especificado, mas uma página de código foi especificada por uma opção de página de código no comando ou pela dica BCPFILECP bcp_control, todos os dados SQLCHAR de colunas que não têm nenhuma especificação de agrupamento de coluna serão armazenados usando a página de código especificada.

    ObservaçãoObservação

    Para obter informações sobre as opções de página de código, consulte "Usando uma página de código", anteriormente neste tópico. Para obter mais informações sobre a dica BCOFILECP, consulte bcp_control.

  • Se um agrupamento ou uma página de código não forem especificados, os dados SQLCHAR serão armazenados usando a página de código OEM do computador cliente.

ObservaçãoObservação

Nenhuma informação sobre agrupamento/página de código é armazenada em um arquivo de dados.

Importando dados em massa entre agrupamentos diferentes

Para uma operação de importação em massa, a interpretação de página de código se aplica a colunas armazenadas como formato de caractere, SQLCHAR, dados em um arquivo de dados. Em um arquivo de dados de formato de caractere, todas as colunas são armazenadas como SQLCHAR. Como nenhuma informação sobre agrupamento/página de código é armazenada em um arquivo de dados, para uma operação de importação em massa, você deve fornecer as informações sobre o agrupamento/página de código dos campos de dados.

As regras para determinar o agrupamento ou a página de código a serem usados em uma operação de importação em massa são:

  • Se você especificar um agrupamento de coluna em um arquivo de formato ou usando a função ODBC bcp_setcolfmt (bcp_setcolfmt), os dados SQLCHAR em um arquivo de dados serão interpretados usando a página de código ANSI associada ao agrupamento de coluna especificado. Verifique se suas especificações de agrupamento correspondem aos agrupamentos no arquivo de dados.

  • Se um agrupamento de coluna não for especificado, mas uma página de código é especificada usando a opção de página de código no comando ou a dica BCPFILECP bcp_control, os dados SQLCHAR serão interpretados usando a página de código especificada.

    ObservaçãoObservação

    Para obter informações sobre as opções de página de código, consulte Usando uma página de código, anteriormente neste tópico. Para obter mais informações sobre a dica BCOFILECP, consulte bcp_control.

  • Se não for especificado nenhum agrupamento ou nenhuma página de código, os dados nas colunas SQLCHAR serão interpretados usando a página de código OEM do computador cliente.

Em uma operação da importação em massa, a especificação do agrupamento controla o seguinte:

  • Como a operação tenta interpretar a página de código de colunas SQLCHAR no arquivo de dados.

  • Como bcp ou BULK INSERT aplica a dica ORDER, se especificada.

    Se você usar a dica ORDER, a operação de importação em massa usará agrupamentos para interpretar a dica ORDER corretamente. Essa dica se aplica às colunas SQLCHAR e SQLNCHAR. Os dados nas colunas referenciadas pela dica ORDER devem estar na sequência definida pelo agrupamento mapeado para essas colunas. Para obter mais informações, consulte Controlando a ordem de classificação durante a importação em massa de dados.