Compartir a través de


Uso del formato nativo para importar o exportar datos (SQL Server)

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

Se recomienda usar el formato nativo cuando se realiza una transferencia de datos en bloque entre varias instancias de SQL Server mediante un archivo de datos que no contiene juegos de caracteres extendidos o de doble byte (DBCS).

Nota:

Para realizar una transferencia masiva de datos entre varias instancias de SQL Server utilizando un archivo de datos que contenga caracteres extendidos o DBCS, debe utilizar el formato nativo Unicode. Para obtener más información, vea Usar el formato nativo Unicode para importar o exportar datos (SQL Server).

El formato nativo mantiene los tipos de datos nativos de una base de datos. Está pensado para transferencias de datos de alta velocidad entre tablas de SQL Server. Si utiliza un archivo de formato, las tablas de origen y destino no tienen que ser idénticas. La transferencia de datos implica dos pasos:

  1. Exportación masiva de datos de una tabla de origen a un archivo de datos

  2. Importación masiva de datos de un archivo de datos a una tabla de destino

El uso del formato nativo entre tablas idénticas evita la conversión innecesaria de tipos de datos a y desde el formato de caracteres, lo que ahorra tiempo y espacio. No obstante, para obtener la velocidad de transferencia óptima, se realizan algunas comprobaciones relativas al formato de los datos. Para evitar problemas con los datos cargados, vea la siguiente lista de restricciones.

Limitaciones

Para importar datos con formato nativo correctamente, asegúrese de lo siguiente:

  • El archivo de datos tiene formato nativo.

  • O bien la tabla de destino debe ser compatible con el archivo de datos (tiene el mismo número de columnas, el mismo tipo de datos, la misma longitud, el estado NULL, etc.) o bien debe utilizar un archivo de formato para asignar cada campo a las columnas correspondientes.

    Nota:

    Si importa datos de un archivo que no coincide con la tabla de destino, la operación de importación puede ser correcta pero, probablemente, los valores de los datos insertados en la tabla de destino son incorrectos. Esto se debe a que los datos del archivo se interpretan utilizando el formato de la tabla de destino. Por tanto, si hay alguna incoherencia, se insertan valores incorrectos. No obstante, en ningún caso puede tal incoherencia dar lugar a incoherencias lógicas o físicas en la base de datos.

    Para obtener información sobre el uso de archivos de formato, vea Formato de archivos para importar o exportar datos (SQL Server).

Una importación correcta no daña la tabla de destino.

Cómo trata bcp los datos con formato nativo

Esta sección aborda una serie de consideraciones especiales sobre el modo en que la utilidad bcp exporta e importa datos con formato nativo.

  • Datos que no son caracteres

    La utilidad bcp usa el formato de datos binario interno de SQL Server para escribir datos que no son caracteres de una tabla a un archivo de datos.

  • Datoschar o varchar

    Al principio de cada campo char o varchar , bcp agrega la longitud de prefijo.

    Importante

    Cuando se usa el modo nativo, de forma predeterminada, la utilidad bcp convierte los caracteres de SQL Server en caracteres OEM antes de copiarlos en un archivo de datos. La utilidad bcp convierte los caracteres de un archivo de datos en caracteres ANSI antes de importarlos masivamente a una tabla de SQL Server. Durante estas conversiones, se pueden perder datos que tengan caracteres extendidos. Para caracteres extendidos, utilice el formato nativo Unicode o especifique una página de códigos.

  • Datossql_variant

    Si se almacenan datos sql_variant como SQLVARIANT en un archivo de datos con formato nativo, los datos mantienen todas sus características. Los metadatos que registran el tipo de datos de cada valor de datos se almacenan junto con el valor de los datos. Estos metadatos se usan para volver a crear el valor de los datos con el mismo tipo de datos en una columna sql_variant de destino.

    Si el tipo de datos de la columna de destino no es sql_variant, cada valor de datos se convierte al tipo de datos de la columna de destino, con las reglas normales de conversión implícita de datos. Si se produce un error durante la conversión de los datos, se revierte el lote actual. Los valores char y varchar que se transfieren entre sql_variant columnas pueden tener problemas de conversión de página de códigos.

    Para obtener más información sobre la conversión de datos, vea Conversión de tipos de datos (motor de base de datos).

Opciones de comando para el formato nativo

Puede importar datos con formato nativo a una tabla mediante el uso de 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 nativo admite las siguientes opciones de comando:

Comando Opción Descripción
bcp -n Hace que la utilidad bcp use los tipos de datos nativos de los datos.*
BULK INSERT DATAFILETYPE ='native' Utiliza los tipos de datos nativos o nativos anchos de los datos. DATAFILETYPE no es necesario si un archivo de formato especifica los tipos de datos.
OPENROWSET N/D Debe usar un archivo de formato

* Para cargar datos nativos (-n) en un formato compatible con versiones anteriores de clientes de SQL Server, use el -V modificador . Para obtener más información, vea Importar datos de formato nativo y de caracteres de versiones anteriores de SQL Server.

Nota:

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

Condiciones de prueba de ejemplo

En los ejemplos se usan la base de datos y los archivos de formato creados en este artículo.

Tabla de ejemplo

El siguiente script crea una base de datos de prueba, una tabla denominada myNative , y la rellena con algunos valores iniciales. Ejecute el siguiente Transact-SQL en Microsoft SQL Server Management Studio (SSMS):

CREATE DATABASE TestDatabase;
GO

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

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

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

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. Consulte Usar 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, myNative.fmt, basado en el esquema de myNative. Para usar un comando bcp para crear un archivo de formato, especifique el argumento format y use nul 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 datos de caracteres y se usa T para especificar una conexión de confianza mediante la seguridad integrada. En un símbolo del sistema, escriba los comandos siguientes:

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

REM Review file
Notepad D:\BCP\myNative.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 ejemplos se usan la base de datos y los archivos de formato creados en este artículo.

Uso de bcp y formato nativo para exportar datos

El interruptor -n y el comando OUT.

El archivo de datos creado en este ejemplo se usará en ejemplos posteriores.

En un símbolo del sistema, escriba los comandos siguientes:

bcp TestDatabase.dbo.myNative OUT D:\BCP\myNative.bcp -T -n

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

Uso de bcp y formato nativo para importar datos sin un archivo de formato

El interruptor -n y el comando IN.

En un símbolo del sistema, escriba los comandos siguientes:

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

REM Import data
bcp TestDatabase.dbo.myNative IN D:\BCP\myNative.bcp -T -n

REM Review results
SQLCMD -Q "SELECT * FROM TestDatabase.dbo.myNative;"

Usar bcp y formato nativo para importar datos con un archivo de formato no XML

Los interruptores -n y -f y el comando IN.

En un símbolo del sistema, escriba los comandos siguientes:

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

REM Import data
bcp TestDatabase.dbo.myNative IN D:\BCP\myNative.bcp -f D:\BCP\myNative.fmt -T

REM Review results
SQLCMD -Q "SELECT * FROM TestDatabase.dbo.myNative;"

Usar BULK INSERT y formato nativo sin un archivo de formato

Argumento DATAFILETYPE.

Ejecute el siguiente Transact-SQL en Microsoft SQL Server Management Studio (SSMS):

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

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

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

Argumento FORMATFILE.

Ejecute el siguiente Transact-SQL en Microsoft SQL Server Management Studio (SSMS):

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

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

Usar OPENROWSET y el formato nativo con un archivo de formato no XML

Argumento FORMATFILE.

Ejecute el siguiente Transact-SQL en Microsoft SQL Server Management Studio (SSMS):

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

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

Para usar formatos de datos para la importación masiva o exportación masiva: