Usar el formato nativo para importar o exportar datos

Se recomienda utilizar el formato nativo cuando al realizar una transferencia masiva de datos entre varias instancias de Microsoft SQL Server utilizando un archivo de datos que no contiene 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.

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.

Restricciones

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 más información acerca del uso de archivos de formato, vea Archivos de formato para importar o exportar datos.

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 utiliza el formato de datos binario interno de SQL Server para escribir datos que no son caracteres de una tabla en un archivo de datos.

  • Datos char o varchar

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

    Nota importanteImportante

    Cuando se utiliza el modo nativo, de manera predeterminada, la utilidad bcp convierte los caracteres de SQL Server en caracteres OEM antes de copiarlos en el archivo de datos. La utilidad bcp convierte caracteres de un archivo de datos en caracteres ANSI antes de realizar la importación masiva de los mismos 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. Para obtener más información acerca de cómo usar una página de códigos, vea Copiar datos entre distintas intercalaciones.

  • Datos sql_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 utilizan para crear de nuevo 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 dato 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 columnas sql_variant pueden tener problemas de conversión de página de códigos. Para obtener más información, vea Copiar datos entre distintas intercalaciones.

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

Opciones de comando para el formato nativo

Puede importar datos con formato nativo en una tabla utilizando 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 línea de comandos. Para una instrucción INSERT ... SELECT * FROM OPENROWSET(BULK...) debe especificar el formato de datos en un archivo de formato.

Las siguientes opciones de la línea de comandos admiten el formato nativo:

Comando

Opción

Descripción

bcp

-n

Hace que la utilidad bcp utilice los tipos de datos nativos de los datos.1

BULK INSERT

DATAFILETYPE ='native'

Utiliza los tipos de datos nativos o nativos anchos de los datos. Tenga en cuenta que DATAFILETYPE no es necesario si el archivo de formato especifica los tipos de datos.

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

Para obtener más información, vea bcp (utilidad), BULK INSERT (Transact-SQL) o OPENROWSET (Transact-SQL).

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.

Ejemplos

En los siguientes ejemplos se muestra el modo de exportar masivamente datos nativos con bcp e importar masivamente los mismos datos mediante BULK INSERT.

Tabla de ejemplo

Los ejemplos requieren que se cree una tabla denominada myTestNativeData en la base de datos de ejemplo AdventureWorks, bajo el esquema dbo. Antes de poder ejecutar los ejemplos, debe crear esta tabla. En el Editor de consultas de SQL Server Management Studio, ejecute:

USE AdventureWorks2008R2;
GO
CREATE TABLE myTestNativeData (
   Col1 smallint,
   Col2 nvarchar(50),
   Col3 nvarchar(50)
   ); 

Para rellenar esta tabla y ver el contenido resultante, ejecute las siguientes instrucciones:

INSERT INTO myTestNativeData(Col1,Col2,Col3)
   VALUES(1,'DataField2','DataField3');
INSERT INTO myTestNativeData(Col1,Col2,Col3)
   VALUES(2,'DataField2','DataField3');
GO
SELECT Col1,Col2,Col3 FROM myTestNativeData

Usar bcp para exportar masivamente datos nativos

Para exportar datos de la tabla a un archivo de datos, use bcp con la opción out y los siguientes calificadores:

Calificadores

Descripción

-n

Especifica tipos de datos nativos.

-T

Especifica que la utilidad bcp se conecte a SQL Server mediante una conexión de confianza usando la seguridad integrada. Si no se especifica -T, es necesario especificar -U y -P para iniciar la sesión correctamente.

En el siguiente ejemplo se exportan masivamente datos en formato nativo desde la tabla myTestNativeData en un nuevo archivo de datos denominado myTestNativeData-n.Dat. En el símbolo del sistema de Microsoft Windows, especifique:

bcp AdventureWorks2008R2..myTestNativeData out C:\myTestNativeData-n.Dat -n -T

Usar BULK INSERT para importar masivamente datos nativos

En el siguiente ejemplo se utiliza BULK INSERT para importar los datos del archivo de datos myTestNativeData-n.Dat a la tabla myTestNativeData. En el Editor de consultas de SQL Server Management Studio, ejecute:

USE AdventureWorks2008R2;
GO
BULK INSERT myTestNativeData 
    FROM 'C:\myTestNativeData-n.Dat' 
   WITH (DATAFILETYPE='native'); 
GO
SELECT Col1,Col2,Col3 FROM myTestNativeData
GO