Uso del formato de caracteres Unicode para importar o exportar datos (SQL Server)

Se aplica a:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsAnalytics Platform System (PDW)

El formato de caracteres Unicode se recomienda para las transferencias masivas de datos entre varias instancias de SQL Server mediante un archivo de datos que contenga caracteres DBCS o extendidos. El formato de datos de caracteres Unicode permite exportar datos desde un servidor mediante una página de códigos utilizada por el cliente que está realizando la operación. En esos casos, el uso del formato de caracteres Unicode tiene las siguientes ventajas:

  • Si los datos de origen y destino son de tipo Unicode, el uso del formato de caracteres Unicode mantiene todos los datos de los caracteres.

  • Si los datos de origen y de destino no son de tipo Unicode, el uso del formato de caracteres Unicode minimiza la pérdida de caracteres extendidos en los datos de origen que no pueden representarse en el destino.

En este tema:
Consideraciones sobre el uso del formato de caracteres Unicode
Consideraciones especiales sobre el uso del formato de caracteres Unicode, bcp y un archivo de formato
Opciones de comando para el formato de caracteres Unicode
Condiciones de prueba de ejemplo
 ● Tabla de ejemplo
 ● Archivo de formato no XML de ejemplo
Ejemplos
 ● Usar bcp y el formato de caracteres para exportar datos
 ● Usar bcp y el formato de caracteres Unicode para importar datos sin un archivo de formato
 ● Usar bcp y el formato de caracteres Unicode para importar datos con un archivo de formato no XML
 ● Usar BULK INSERT y el formato de caracteres Unicode sin un archivo de formato
 ● Usar BULK INSERT y el formato de caracteres Unicode con un archivo de formato no XML
 ● Usar OPENROWSET y el formato de caracteres Unicode con un archivo de formato no XML
Tareas relacionadas

Consideraciones sobre el uso del formato de caracteres Unicode

A la hora de usar el formato de caracteres Unicode, tenga en cuenta que:

  • De forma predeterminada, la utilidad bcp separa los campos de datos de caracteres con el carácter de tabulación y finaliza los registros con el carácter de nueva línea. Para obtener más información sobre cómo especificar otros terminadores, vea Especificar terminadores de campo y de fila (SQL Server).

  • Los datos sql_variant almacenados en un archivo de datos con formato de caracteres Unicode funcionan de la misma forma que en un archivo de datos en formato de caracteres, con la excepción de que los datos se almacenan como nchar en lugar de almacenarse como char . Para obtener más información sobre el formato de caracteres, consulte Compatibilidad con la intercalación y Unicode.

Consideraciones especiales sobre el uso del formato de caracteres Unicode, bcp y un archivo de formato

Los archivos de datos con formato de caracteres Unicode utilizan las convenciones de los archivos Unicode. Los primeros dos bytes del archivo son los números hexadecimales 0xFFFE. Estos bytes funcionan como marcas de orden de bytes (BOM), ya que especifican si el byte de orden alto se almacena el primero o el último en el archivo. La utilidad bcp podría malinterpretar la marca de orden de bytes y provocar que parte del proceso de importación dé error. Es posible que reciba un mensaje de error similar al siguiente:

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

La marca de orden de bytes podría malinterpretarse en las siguientes condiciones:

  • Se usa la utilidad bcp y el modificador -w para indicar el carácter Unicode.

  • Se usa un archivo de formato.

  • El primer campo del archivo de datos es un campo sin caracteres.

Averigüe si alguna de las siguientes soluciones alternativas está disponible para su situación concreta :

Opciones de comando para el formato de caracteres Unicode

Puede importar datos del formato de caracteres Unicode en una tabla mediante bcp, BULK INSERT o INSERT... SELECT * FROM OPENROWSET(BULK...). Para un comando bcp o una instrucción BULK INSERT, puede especificar el formato de datos en la instrucción. Para una instrucción INSERT ... SELECT * FROM OPENROWSET(BULK...), debe especificar el formato de datos en un archivo de formato.

El formato de caracteres Unicode se puede usar con las siguientes opciones de comando:

Get-Help Opción Descripción
BCP -w Usa el formato de caracteres Unicode.
BULK INSERT DATAFILETYPE ='widechar' Utiliza el formato de caracteres Unicode al importar datos masivamente.
OPENROWSET N/D Debe usar un archivo de formato

Nota

Otra posibilidad es especificar el formato por campo en un archivo de formato. Para obtener más información, vea Archivos de formato para importar o exportar datos (SQL Server).

Condiciones de prueba de ejemplo

Los ejemplos de este tema se basan en la tabla y en el archivo de formato definidos a continuación.

Tabla de ejemplo

El siguiente script crea una base de datos de prueba, una tabla denominada myWidechar , y la rellena con algunos valores iniciales. Ejecutar el siguiente Transact-SQL en 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;

Archivo de formato no XML de ejemplo

SQL Server admite dos tipos de archivos de formato: XML y no XML. El formato no XML es el formato original compatible con versiones anteriores de SQL Server. Revise Archivos de formato no XML (SQL Server) para obtener información detallada. El siguiente comando hará uso de la utilidad BCP para generar un archivo de formato no XML, myWidechar.fmt, basado en el esquema de myWidechar. Si quiere usar un comando BCP para crear un archivo de formato, especifique el argumento format y use null en lugar de una ruta de acceso de archivo de datos. La opción format también requiere la opción -f . Además, en este ejemplo, el calificador c se usa para especificar los datos de caracteres, mientras que T se usa para especificar una conexión de confianza que usa la seguridad integrada. En un símbolo del sistema, escriba los comandos siguientes:

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

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

Importante

Asegúrese de que el archivo de formato no XML termina con un retorno de carro o avance de línea. De lo contrario, es probable que reciba el mensaje de error siguiente:

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

Ejemplos

En los siguientes ejemplos se usan la base de datos y los archivos de formato creados anteriormente.

Usar bcp y el formato de caracteres para exportar datos

Modificador -w y comando OUT . Nota: el archivo de datos creado en este ejemplo se usará en todos los ejemplos siguientes. En un símbolo del sistema, escriba los comandos siguientes:

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

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

Usar bcp y el formato de caracteres Unicode para importar datos sin un archivo de formato

Modificador -w y comando IN . En un símbolo del sistema, escriba los comandos siguientes:

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

Usar bcp y el formato de caracteres Unicode para importar datos con un archivo de formato no XML

Modificadores -w y -f switches y IN commy. Se deberá aplicar una solución alternativa, puesto que este ejemplo implica bcp, un archivo de formato, un carácter Unicode y el primer campo de datos del archivo de datos es un campo sin caracteres. Consulte la sección Consideraciones especiales sobre el uso del formato de caracteres Unicode, bcp y un archivo de formato, que aparece más arriba. El archivo de datos myWidechar.bcp se alterará mediante la adición de un registro adicional como registro "ficticio", que se omitirá con el modificador -F 2.

En un símbolo del sistema, escriba los siguientes comandos y siga los pasos de modificación:

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

Usar BULK INSERT y el formato de caracteres Unicode sin un archivo de formato

ArgumentoDATAFILETYPE . Ejecutar el siguiente Transact-SQL en 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;

Usar BULK INSERT y el formato de caracteres Unicode con un archivo de formato no XML

ArgumentoFORMATFILE . Ejecutar el siguiente Transact-SQL en 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;

Usar OPENROWSET y el formato de caracteres Unicode con un archivo de formato no XML

ArgumentoFORMATFILE . Ejecutar el siguiente Transact-SQL en 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 datos para la importación o exportación masivas

Consulte también

bcp (utilidad)
BULK INSERT (Transact-SQL)
OPENROWSET (Transact-SQL)
Tipos de datos (Transact-SQL)
Compatibilidad con la intercalación y Unicode