Usar o formato de caractere Unicode para importar ou exportar dados (SQL Server)

Aplica-se a: SQL Server (todas as versões com suporte) Banco de Dados SQL do Azure Instância Gerenciada de SQL do Azure Azure Synapse Analytics PDW (Analytics Platform System)

O formato de caractere Unicode é recomendado para transferir em massa dados entre várias instâncias do SQL Server usando um arquivo de dados com caracteres estendidos DBCS. O formato de dados de caractere Unicode permite exportar dados de um servidor usando uma página de código que difere da página de código usada pelo cliente que está executando a operação. Em tais casos, o uso do formato de caractere Unicode tem as seguintes vantagens:

  • Se os dados de origem e destino forem tipos de dados Unicode, o uso do formato de caractere Unicode preservará todos os dados de caractere.

  • Se os dados de origem e destino não forem tipos de dados Unicode, o uso do formato de caractere Unicode minimizará a perda de caracteres estendidos nos dados de origem que não podem ser representados no destino.

Neste tópico:
Considerações sobre usar o formato de caractere Unicode
Considerações especiais para o formato de caractere Unicode, bcp e um arquivo de formato
Opções de comando para formato de caractere Unicode
Condições de teste de exemplo
 ● Tabela de amostra
 ● Arquivo em formato não XML de amostra
Exemplos
 ● Usando bcp e formato de caractere Unicode para exportar dados
 ● Usando bcp e formato de caractere Unicode para importar dados sem um arquivo de formato
 ● Usando bcp e formato de caractere Unicode para importar dados com um arquivo de formato não XML
 ● Usando BULK INSERT e formato de caractere Unicode sem um arquivo de formato
 ● Usando BULK INSERT e formato de caractere Unicode com um arquivo de formato não XML
 ● Usando OPENROWSET e formato de caractere Unicode com um arquivo de formato não XML
Tarefas relacionadas

Considerações sobre usar o formato de caractere Unicode

Ao usar formato de caractere Unicode, considere o seguinte:

  • Por padrão, o utilitário bcp separa os campos dos dados de caractere com o caractere de guia e termina os registros com o caractere de nova linha. Para obter informações sobre como especificar terminadores alternativos, consulte Especificar terminadores de campo e linha (SQL Server).

  • Os dados de sql_variant que são armazenados em um arquivo de dados no formato de caractere Unicode operam da mesma maneira que operam em um arquivo de dados no formato de caractere, com a exceção de que os dados são armazenados como nchar em vez de dados char . Para obter mais informações sobre formato de caractere, consulte Suporte a ordenação e Unicode.

Considerações especiais para o formato de caractere Unicode, bcp e um arquivo de formato

Os arquivos de dados em formato de caractere Unicode seguem as convenções para arquivos Unicode. Os primeiros dois bytes do arquivo são números hexadecimais, 0xFFFE. Esses bytes servem como marcas de ordem do byte (BOM), especificando se o byte de ordem alta é armazenado em primeiro ou por último no arquivo. O utilitário bcp pode interpretar incorretamente o BOM e fazer com que parte de seu processo de importação falhe; você pode receber uma mensagem de erro semelhante da seguinte maneira:

Starting copy...
SQLState = 22005, NativeError = 0
Error = [Microsoft][ODBC Driver 13 for SQL Server]Invalid character value for cast specification

O BOM pode ser interpretado incorretamente sob as seguintes condições:

  • O utilitário bcp é usado e a opção -w é usada para indicar o caractere Unicode

  • É usado um arquivo de formato

  • O primeiro campo no arquivo de dados é não caractere

Considere se qualquer uma das seguintes alternativas podem estar disponíveis para sua situação específica :

Opções de comando para formato de caractere Unicode

Você pode importar dados de formato de caractere Unicode para uma tabela usando bcp, BULK INSERT ou INSERT... SELECT * FROM OPENROWSET(BULK...). Para um comando bcp ou uma instrução BULK INSERT, você pode especificar o formato de dados na instrução. Para uma instrução INSERT... SELECT * FROM OPENROWSET(BULK...), é necessário especificar o formato dos dados em um arquivo de formato.

Formato de caractere Unicode tem suporte nas seguintes opções da linha de comando:

Comando Opção Descrição
bcp -w Usa o formato de caractere Unicode.
BULK INSERT DATAFILETYPE ='widechar' Usa o formato de caractere Unicode na importação em massa de dados.
OPENROWSET N/D Deve usar um arquivo de formato

Observação

Como alternativa, você pode especificar a formatação por campo, em um arquivo de formato. Para obter mais informações, confira Arquivos de formato para importação ou exportação de dados (SQL Server).

Condições de teste de exemplo

Os exemplos neste tópico baseiam-se na tabela e no arquivo de formato definidos abaixo.

Tabela de exemplo

O script a seguir cria um banco de dados de teste, uma tabela chamada de myWidechar e preenche a tabela com alguns valores iniciais. Execute o seguinte comando Transact-SQL no Microsoft SQL Server Management Studio (SSMS):

CREATE DATABASE TestDatabase;
GO

USE TestDatabase;
CREATE TABLE dbo.myWidechar ( 
	PersonID smallint NOT NULL,
	FirstName nvarchar(25) NOT NULL,
	LastName nvarchar(30) NOT NULL,
	BirthDate date,
	AnnualSalary money
);

-- Populate table
INSERT TestDatabase.dbo.myWidechar
VALUES 
(1, N'ϴAnthony', N'Grosse', '02-23-1980', 65000.00),
(2, N'❤Alica', N'Fatnowna', '11-14-1963', 45000.00),
(3, N'☎Stella', N'Rossenhain', '03-02-1992', 120000.00);

-- Review Data
SELECT * FROM TestDatabase.dbo.myWidechar;

Exemplo de arquivo de formato não XML

O SQL Server dá suporte a dois tipos de arquivo de formato: XML e não XML. O formato não XML é o formato original com suporte em versões anteriores do SQL Server. Examine Arquivos de formato não XML (SQL Server) para obter informações detalhadas. O comando a seguir usará o utilitário bcp para gerar um arquivo de formato não XML, myWidechar.fmt, com base no esquema de myWidechar. Para usar um comando bcp para criar um arquivo de formato, especifique o argumento format e use nul em vez de um caminho de arquivo de dados. A opção format também exige a opção -f . Além disso, neste exemplo, o qualificador c é usado para especificar dados de caractere, e T é usado para especificar uma conexão confiável usando a segurança integrada. No prompt de comando, digite os seguintes comandos:

bcp TestDatabase.dbo.myWidechar format nul -f D:\BCP\myWidechar.fmt -T -w

REM Review file
Notepad D:\BCP\myWidechar.fmt

Importante

Verifique se o arquivo de formato não XML termina com um retorno de carro/alimentação de linha. Caso contrário, você provavelmente receberá a seguinte mensagem de erro:

SQLState = S1000, NativeError = 0
Error = [Microsoft][ODBC Driver 13 for SQL Server]I/O error while reading BCP format file

Exemplos

Os exemplos abaixo usam o banco de dados e os arquivos de formato criados acima.

Usando bcp e formato de caractere Unicode para exportar dados

Opção -w e comando OUT . Observação: o arquivo de dados criado neste exemplo será usado em todos os exemplos subsequentes. No prompt de comando, digite os seguintes comandos:

bcp TestDatabase.dbo.myWidechar OUT D:\BCP\myWidechar.bcp -T -w

REM Review results
NOTEPAD D:\BCP\myWidechar.bcp

Usando bcp e formato de caractere Unicode para importar dados sem um arquivo de formato

Opção -w e comando IN . No prompt de comando, digite os seguintes comandos:

REM Truncate table (for testing)
SQLCMD -Q "TRUNCATE TABLE TestDatabase.dbo.myWidechar;"

REM Import data
bcp TestDatabase.dbo.myWidechar IN D:\BCP\myWidechar.bcp -T -w

REM Review results is SSMS

Usando bcp e formato de caractere Unicode para importar dados com um arquivo de formato não XML

Opções -w e -f switches e IN comme. Uma solução alternativa precisará ser usada, já que este exemplo envolve bcp, um arquivo de formato, caractere Unicode, e o primeiro campo de dados no arquivo de dados é não caractere. Consulte Considerações especiais para o formato de caractere Unicode, bcp e um arquivo de formato, acima. O arquivo de dados myWidechar.bcp será alterado adicionando um registro adicional como um registro "fictício", em seguida, será ignorado com a opção -F 2.

No prompt de comando, digite os seguintes comandos e siga as etapas de modificação:

REM Truncate table (for testing)
SQLCMD -Q "TRUNCATE TABLE TestDatabase.dbo.myWidechar;"

REM Open data file
Notepad D:\BCP\myWidechar.bcp
REM Copy first record and then paste as new first record.  This additional record is the "dummy" record.
REM Close file.

REM Import data instructing bcp to skip dummy record with the -F 2 switch.
bcp TestDatabase.dbo.myWidechar IN D:\BCP\myWidechar.bcp -f D:\BCP\myWidechar.fmt -T -F 2

REM Review results is SSMS

REM Return data file to original state for usage in other examples
bcp TestDatabase.dbo.myWidechar OUT D:\BCP\myWidechar.bcp -T -w

Usando BULK INSERT e formato de caractere Unicode sem um arquivo de formato

ArgumentoDATAFILETYPE . Execute o seguinte comando Transact-SQL no Microsoft SQL Server Management Studio (SSMS):

TRUNCATE TABLE TestDatabase.dbo.myWidechar; -- for testing
BULK INSERT TestDatabase.dbo.myWidechar
	FROM 'D:\BCP\myWidechar.bcp'
	WITH (
		DATAFILETYPE = 'widechar'
		);

-- review results
SELECT * FROM TestDatabase.dbo.myWidechar;

Usando BULK INSERT e formato de caractere Unicode com um arquivo de formato não XML

ArgumentoFORMATFILE . Execute o seguinte comando Transact-SQL no Microsoft SQL Server Management Studio (SSMS):

TRUNCATE TABLE TestDatabase.dbo.myWidechar; -- for testing
BULK INSERT TestDatabase.dbo.myWidechar
   FROM 'D:\BCP\myWidechar.bcp'
   WITH (
		FORMATFILE = 'D:\BCP\myWidechar.fmt'
		);

-- review results
SELECT * FROM TestDatabase.dbo.myWidechar;

Usando OPENROWSET e formato de caractere Unicode com um arquivo de formato não XML

ArgumentoFORMATFILE . Execute o seguinte comando Transact-SQL no Microsoft SQL Server Management Studio (SSMS):

TRUNCATE TABLE TestDatabase.dbo.myWidechar;  -- for testing
INSERT INTO TestDatabase.dbo.myWidechar
	SELECT *
	FROM OPENROWSET (
		BULK 'D:\BCP\myWidechar.bcp', 
		FORMATFILE = 'D:\BCP\myWidechar.fmt'  
		) AS t1;

-- review results
SELECT * FROM TestDatabase.dbo.myWidechar;

Para usar formatos de dados para importação ou exportação em massa

Consulte Também

Utilitário bcp
BULK INSERT (Transact-SQL)
OPENROWSET (Transact-SQL)
Tipos de dados (Transact-SQL)
Suporte a ordenações e a Unicode