Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
Se aplica a:SQL Server
Azure SQL Database
Instancia
administrada de Azure SQLAlmacenamiento en Microsoft Fabric
Importa un archivo de datos en una tabla de base de datos o una vista en un formato especificado por el usuario en SQL Server.
Convenciones de sintaxis de Transact-SQL
Sintaxis
BULK INSERT
{ database_name.schema_name.table_or_view_name | schema_name.table_or_view_name | table_or_view_name }
FROM 'data_file'
[ WITH
(
[ [ , ] DATA_SOURCE = 'data_source_name' ]
-- text formatting options
[ [ , ] CODEPAGE = { 'RAW' | 'code_page' | 'ACP' | 'OEM' } ]
[ [ , ] DATAFILETYPE = { 'char' | 'widechar' | 'native' | 'widenative' } ]
[ [ , ] ROWTERMINATOR = 'row_terminator' ]
[ [ , ] FIELDTERMINATOR = 'field_terminator' ]
[ [ , ] FORMAT = 'CSV' ]
[ [ , ] FIELDQUOTE = 'quote_characters' ]
[ [ , ] FIRSTROW = first_row ]
[ [ , ] LASTROW = last_row ]
-- input file format options
[ [ , ] FORMATFILE = 'format_file_path' ]
[ [ , ] FORMATFILE_DATA_SOURCE = 'data_source_name' ]
-- error handling options
[ [ , ] MAXERRORS = max_errors ]
[ [ , ] ERRORFILE = 'file_name' ]
[ [ , ] ERRORFILE_DATA_SOURCE = 'errorfile_data_source_name' ]
-- database options
[ [ , ] KEEPIDENTITY ]
[ [ , ] KEEPNULLS ]
[ [ , ] FIRE_TRIGGERS ]
[ [ , ] CHECK_CONSTRAINTS ]
[ [ , ] TABLOCK ]
-- source options
[ [ , ] ORDER ( { column [ ASC | DESC ] } [ , ...n ] ) ]
[ [ , ] ROWS_PER_BATCH = rows_per_batch ]
[ [ , ] KILOBYTES_PER_BATCH = kilobytes_per_batch ]
[ [ , ] BATCHSIZE = batch_size ]
) ]
BULK INSERT
{ database_name.schema_name.table_or_view_name | schema_name.table_or_view_name | table_or_view_name }
FROM 'data_file'
[ WITH
(
[ [ , ] DATA_SOURCE = 'data_source_name' ]
-- text formatting options
[ [ , ] CODEPAGE = { 'code_page' | 'ACP' } ]
[ [ , ] DATAFILETYPE = { 'char' | 'widechar' } ]
[ [ , ] ROWTERMINATOR = 'row_terminator' ]
[ [ , ] FIELDTERMINATOR = 'field_terminator' ]
[ [ , ] FORMAT = { 'CSV' | 'PARQUET' } ]
[ [ , ] FIELDQUOTE = 'quote_characters' ]
[ [ , ] FIRSTROW = first_row ]
[ [ , ] LASTROW = last_row ]
-- input file format options
[ [ , ] FORMATFILE = 'format_file_path' ]
[ [ , ] FORMATFILE_DATA_SOURCE = 'data_source_name' ]
-- error handling options
[ [ , ] MAXERRORS = max_errors ]
[ [ , ] ERRORFILE = 'file_name' ]
[ [ , ] ERRORFILE_DATA_SOURCE = 'errorfile_data_source_name' ]
) ]
Argumentos
La instrucción BULK INSERT tiene diferentes argumentos y opciones en distintas plataformas. Las diferencias se resumen en la tabla siguiente:
| Característica | Servidor SQL | Azure SQL Database e Instancia administrada de Azure SQL | Almacenamiento de datos de tejido |
|---|---|---|---|
| Origen de datos | Ruta de acceso local, ruta de acceso de red (UNC) o Azure Storage | Azure Storage | Azure Storage, One Lake |
| Autenticación de origen | Autenticación de Windows, SAS | Microsoft Entra ID, token de SAS, identidad administrada | Microsoft Entra ID |
| Opciones no admitidas |
* comodines en el camino, FORMAT = 'PARQUET' |
* comodines en el camino, FORMAT = 'PARQUET' |
DATAFILETYPE = {'native' | 'widenative'} |
| Opciones habilitadas, pero sin efecto |
KEEPIDENTITY, , FIRE_TRIGGERS, CHECK_CONSTRAINTSTABLOCK, ORDER, ROWS_PER_BATCH, KILOBYTES_PER_BATCHy BATCHSIZE no son aplicables. No producen un error de sintaxis, pero no tienen ningún efecto |
database_name
Nombre de la base de datos donde reside la tabla o la vista especificada. Si no se especifica, database_name es la base de datos actual.
schema_name
Especifica el nombre del esquema de la tabla o vista. schema_name es opcional si el esquema predeterminado para el usuario que realiza la operación de importación masiva es el esquema de la tabla o vista especificada. Si no se especifica schema y el esquema predeterminado del usuario que realiza la operación de importación masiva es diferente de la tabla o la vista especificada, SQL Server devuelve un mensaje de error y se cancela la operación de importación masiva.
table_name
Especifica el nombre de la tabla o vista en la que se va a realizar una importación masiva de datos. Solo se pueden utilizar vistas en las que todas las columnas hagan referencia a la misma tabla base. Para obtener más información sobre las restricciones para cargar datos en vistas, vea INSERT.
DE 'data_file'
Especifica la ruta de acceso completa al archivo de datos que contiene los datos que se van a importar a la tabla o vista especificada.
BULK INSERT puede importar datos desde un disco o Azure Storage (incluyendo red, disquete, disco duro, etc.).
BULK INSERT bing_covid_19_data
FROM 'C:\\bing_covid-19_data\public\curated\covid-19\latest\bing_covid-19_data.csv';
data_file debe especificar una ruta de acceso válida del servidor en el que se ejecuta SQL Server. Si data_file es un archivo remoto, especifique un nombre UNC (convención de nomenclatura universal). Un nombre UNC tiene el formato \\SystemName\ShareName\Path\FileName. Por ejemplo:
BULK INSERT bing_covid_19_data
FROM '\\ShareX\bing_covid-19_data\public\curated\covid-19\latest\bing_covid-19_data.csv';
Azure SQL Database y Fabric Data Warehouse soportan la lectura de datos desde URI, pero no admiten rutas de archivos locales.
BULK INSERT bing_covid_19_data
FROM 'https://<data-lake>.blob.core.windows.net/public/curated/covid-19/bing_covid-19_data/latest/bing_covid-19_data.csv';
A partir de SQL Server 2017 (14.x), el data_file puede estar en Azure Storage. En ese caso, también debe especificar data_source_name opción. Para un ejemplo, véase Importar datos de un archivo en Azure Storage.
Fabric Data Warehouse soporta dos estilos de ruta diferentes para especificar la ruta fuente:
https://<storage account>.blob.core.windows.net/<container name>/<path to file>abfss://<container name>@<storage account>.dfs.core.windows.net/<path to file>
Fabric Data Warehouse admite * comodines que pueden coincidir con cualquier carácter del URI, y te permiten definir un patrón de URI para los archivos que deben importarse. Por ejemplo:
BULK INSERT bing_covid_19_data
FROM 'https://<data-lake>.blob.core.windows.net/public/curated/covid-19/bing_covid-19_data/latest/*.csv';
Nota
Reemplace por <data-lake>.blob.core.windows.net una dirección URL adecuada.
DATA_SOURCE
Aplica a: SQL Server 2017 (14.x) y versiones posteriores, Azure SQL Database y Warehouse en Microsoft Fabric.
Especifica una fuente de datos externa con nombre que apunta a una ubicación raíz de Azure Storage para la importación del archivo.
CREATE EXTERNAL DATA SOURCE pandemicdatalake
WITH (LOCATION = 'https://<data-lake>.blob.core.windows.net/public/');
Nota
Reemplace por <data-lake>.blob.core.windows.net una dirección URL adecuada.
Para más información, vea CREATE EXTERNAL DATA SOURCE.
La ruta del archivo en la FROM cláusula debe ser una ruta relativa, que se añadirá a la ubicación raíz definida en la fuente de datos externa.
BULK INSERT bing_covid_19_data
FROM 'curated/covid-19/bing_covid-19_data/latest/bing_covid-19_data.csv'
WITH (DATA_SOURCE = 'pandemicdatalake', FIRSTROW = 2, LASTROW = 100, FIELDTERMINATOR = ',');
Nota
Para simplificar, los siguientes ejemplos utilizan rutas relativas y fuentes de datos externas predefinidas.
CODEPAGE
Especifica la página de códigos de los datos incluidos en el archivo de datos.
CODEPAGE solo es relevante si los datos contienen columnas char, varchar o text con valores de caracteres mayores 127 o menores que 32. Para obtener un ejemplo, vea Especificación de una página de códigos.
BULK INSERT bing_covid_19_data
FROM '/curated/covid-19/bing_covid-19_data/latest/bing_covid-19_data.csv'
WITH (DATA_SOURCE = 'pandemicdatalake', FIRSTROW = 2, CODEPAGE = '65001');
CODEPAGE no es una opción compatible en Linux para SQL Server 2017 (14.x). Para SQL Server 2019 (15.x), solo se permite la 'RAW' opción para CODEPAGE.
Debe especificar un nombre de intercalación para cada columna de un archivo de formato.
CODEPAGE valor |
Descripción |
|---|---|
ACP |
Convierte columnas de los tipos de datos char, varchar o text de la página de códigos ANSI/Microsoft Windows (ISO 1252) a la página de códigos de SQL Server. |
OEM (valor predeterminado) |
Las columnas de tipo de datos char, varchar o text se convierten de la página de códigos del sistema OEM a la página de códigos de SQL Server. |
RAW |
No se realiza ninguna conversión entre páginas de códigos.
RAW es la opción más rápida. |
| code_page | Número específico de una página de códigos; por ejemplo, 850. Las versiones anteriores a SQL Server 2016 (13.x) no admiten la página de códigos 65001 (codificación UTF-8). |
CODEPAGE valor |
Descripción |
|---|---|
ACP |
Convierte columnas de los tipos de datos char, varchar o text de la página de códigos ANSI/Microsoft Windows (ISO 1252) a la página de códigos de SQL Server. |
| code_page | Número específico de una página de códigos; por ejemplo, 850. Las versiones anteriores a SQL Server 2016 (13.x) no admiten la página de códigos 65001 (codificación UTF-8). |
DATAFILETYPE
Especifica que BULK INSERT realiza la operación de importación mediante el valor de tipo de archivo de datos especificado.
BULK INSERT bing_covid_19_data
FROM 'curated/covid-19/bing_covid-19_data/latest/bing_covid-19_data.csv'
WITH (DATA_SOURCE = 'pandemicdatalake', FIRSTROW = 2, DATAFILETYPE = 'char');
Nota
Reemplace por <data-lake>.blob.core.windows.net una dirección URL adecuada.
DATAFILETYPE valor |
Todos los datos representados en |
|---|---|
char (valor predeterminado) |
Formato de caracteres. Para más información, consulte Usar formato de carácter para importar o exportar datos. |
widechar |
Caracteres Unicode. Para más información, consulte Usar formato de caracteres Unicode para importar o exportar datos. |
native |
Tipos de datos nativos (base de datos). Cree el archivo de datos nativos mediante la importación masiva de datos desde SQL Server con la utilidad bcp. El valor native ofrece una alternativa de mayor rendimiento al valor char. 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). Para más información, véase Usar formato nativo para importar o exportar datos. |
widenative |
Tipos de datos nativos (base de datos), salvo en las columnas char, varchar y text, en las que los datos se almacenan como datos Unicode. Cree el archivo de datos mediante la widenative importación masiva de datos desde SQL Server mediante la utilidad bcp .El widenative valor ofrece una alternativa de mayor rendimiento a widechar. Si el archivo de datos contiene caracteres extendidos ANSI, especifique widenative.Para más información, consulte Usar Unicode Native Format para importar o exportar datos. |
DATAFILETYPE valor |
Todos los datos representados en |
|---|---|
char (valor predeterminado) |
Formato de caracteres. Para más información, consulte Usar formato de carácter para importar o exportar datos. |
widechar |
Caracteres Unicode. Para más información, consulte Usar formato de caracteres Unicode para importar o exportar datos. |
MAXERRORS
Especifica el número máximo de errores de sintaxis permitidos en los datos antes de cancelar la operación de importación masiva. Cada fila que no se puede importar con la operación de importación masiva se omite y se considera un error. Si no se especifica max_errors, el valor predeterminado es 10.
BULK INSERT bing_covid_19_data
FROM 'curated/covid-19/bing_covid-19_data/latest/bing_covid-19_data.csv'
WITH (DATA_SOURCE = 'pandemicdatalake', MAXERRORS = 0);
La MAX_ERRORS opción no se aplica a comprobaciones de restricciones ni a convertir tipos de datos de dinero y bigint .
ERROR FILE
Especifica el archivo utilizado para recopilar filas que tienen errores de formato y no pueden convertirse en un conjunto de filas OLE DB. Estas filas se copian en este archivo de errores desde el archivo de datos "tal cual".
BULK INSERT bing_covid_19_data
FROM 'curated/covid-19/bing_covid-19_data/latest/bing_covid-19_data.csv'
WITH (DATA_SOURCE = 'pandemicdatalake',
ERRORFILE = 'https://<data-lake>.blob.core.windows.net/public/curated/covid-19/bing_covid-19_data/latest/errors');
Nota
Reemplace por <data-lake>.blob.core.windows.net una dirección URL adecuada.
El archivo de errores se crea cuando se ejecuta el comando. Se produce un error si el archivo ya existe. Además, se crea un archivo de control con la extensión .ERROR.txt , que hace referencia a cada fila del archivo de error y proporciona diagnósticos de errores. Tan pronto como se corrigen los errores, se pueden cargar los datos.
A partir de SQL Server 2017 (14.x), la error_file_path puede estar en Azure Storage.
ARCHIVO_DE_ERRORES_FUENTE_DE_DATOS
Se aplica a: SQL Server 2017 (14.x) y versiones posteriores.
Especifica una fuente de datos externa nombrada que apunta a la ubicación de Azure Storage del archivo de error para llevar el control de los errores encontrados durante la importación.
BULK INSERT bing_covid_19_data
FROM 'curated/covid-19/bing_covid-19_data/latest/bing_covid-19_data.csv'
WITH (
DATA_SOURCE = 'pandemicdatalake',
ERRORFILE = 'curated/covid-19/bing_covid-19_data/latest/errors',
ERRORFILE_DATA_SOURCE = 'pandemicdatalake'
);
Para más detalles sobre la creación de fuentes de datos externas, véase CREAR FUENTE DE DATOS EXTERNA.
PRIMERA FILA
Especifica el número de la primera fila que se va a cargar. El valor predeterminado es la primera fila del archivo de datos especificado.
FIRSTROW está basado en 1.
BULK INSERT bing_covid_19_data
FROM 'curated/covid-19/bing_covid-19_data/latest/bing_covid-19_data.csv'
WITH (DATA_SOURCE = 'pandemicdatalake', FIRSTROW = 2);
El FIRSTROW atributo no está pensado para omitir los encabezados de columna. La BULK INSERT instrucción no admite la omisión de encabezados. Si decide omitir filas, el Motor de base de datos de SQL Server solo analiza los terminadores de campo y no valida los datos en los campos de las filas omitidas.
ÚLTIMA FILA
Especifica el número de la última fila que va a cargarse. El valor predeterminado es 0, que indica la última fila del archivo de datos especificado.
TAMAÑO DEL LOTE
Especifica el número de filas de un lote. Cada lote se copia en el servidor como una transacción. Si no ocurre así, SQL Server confirma o revierte la transacción de cada lote. De forma predeterminada, todos los datos del archivo de datos especificado componen un lote. Para obtener información sobre las consideraciones de rendimiento, vea Consideraciones de rendimiento más adelante en este artículo.
CONSTRAINTES_DE_VERIFICACIÓN
Especifica que deben comprobarse todas las restricciones de la tabla o vista de destino durante la operación de importación masiva. Sin la CHECK_CONSTRAINTS opción , se omiten las CHECK restricciones y FOREIGN KEY , después de la operación, la restricción de la tabla se marca como no de confianza.
UNIQUE y PRIMARY KEY las restricciones siempre se aplican. Al importar en una columna de caracteres definida con una NOT NULL restricción, BULK INSERT inserta una cadena en blanco cuando no hay ningún valor en el archivo de texto.
En algún momento, debe examinar las restricciones de toda la tabla. Si la tabla no estaba vacía antes de la operación de importación masiva, el costo de volver a validar la restricción podría superar el costo de aplicar CHECK restricciones a los datos incrementales.
Una situación en la que quizá desee que las restricciones estén deshabilitadas (comportamiento predeterminado) es si los datos de entrada contienen filas que infringen las restricciones. Con CHECK restricciones deshabilitadas, puede importar los datos y, a continuación, usar instrucciones Transact-SQL para quitar los datos no válidos.
Nota
La MAXERRORS opción no se aplica a la comprobación de restricciones.
ACTIVADORES_DISPARO
Especifica que se ejecutarán todos los desencadenadores de inserción definidos en la tabla de destino durante la operación de importación masiva. Si los desencadenadores se definen para INSERT las operaciones de la tabla de destino, se activan para cada lote completado.
Si FIRE_TRIGGERS no se especifica, no se ejecuta ningún desencadenador de inserción.
KEEPIDENTITY
Especifica que se usará el valor o valores de identidad del archivo de datos importado para la columna de identidad. Si KEEPIDENTITY no se especifica, los valores de identidad de esta columna se comprueban, pero no se importan, y SQL Server asigna automáticamente valores únicos en función de los valores de inicialización e incremento especificados durante la creación de la tabla. Si el archivo de datos no contiene valores para la columna de identidad de la tabla o vista, utilice un archivo de formato para especificar que se debe omitir la columna de identidad de la tabla o vista cuando se importen los datos; SQL Server asigna automáticamente valores únicos para la columna. Para más información, consulte DBCC CHECKDB.
Para más información, consulta sobre mantener valores identificativos, consulta Mantener valores de identidad al importar datos en bloque.
KEEPNULLS
Especifica que las columnas vacías deben conservar un valor NULL durante la operación de importación masiva, en lugar de tener valores predeterminados para las columnas insertadas. Para más información, consulta Mantener nulos o valores predeterminados durante la importación masiva.
KILOBYTES_PER_BATCH
Especifica el número aproximado de kilobytes (KB) de datos por lote como kilobytes_per_batch. De forma predeterminada, KILOBYTES_PER_BATCH es desconocido. Para obtener información sobre las consideraciones de rendimiento, vea Consideraciones de rendimiento más adelante en este artículo.
PEDIDO
Especifica la forma en que están ordenados los datos del archivo de datos. El rendimiento de la importación masiva mejora si los datos importados se ordenan según el índice clúster de la tabla, si lo hay. Si el archivo de datos se ordena en un orden distinto del orden de una clave de índice agrupada, o si no hay ningún índice agrupado en la tabla, se omite la cláusula ORDER. Los nombres de columna facilitados deben ser nombres válidos en la tabla de destino. De forma predeterminada, la operación de inserción masiva presupone que los datos del archivo no están ordenados. En las importaciones masivas optimizadas, SQL Server también valida que los datos importados estén ordenados.
n es un marcador de posición que indica que se pueden especificar varias columnas.
ROWS_PER_BATCH
Indica el número aproximado de filas de datos del archivo de datos.
De forma predeterminada, todos los datos del archivo de datos se envían al servidor en una sola transacción y el optimizador de consultas desconoce el número de filas del lote. Si especifica ROWS_PER_BATCH (con un valor > 0), el servidor usa este valor para optimizar la operación de importación masiva. El valor especificado para ROWS_PER_BATCH debe ser aproximadamente el mismo que el número real de filas. Para obtener información sobre las consideraciones de rendimiento, vea Consideraciones de rendimiento más adelante en este artículo.
TABLOCK
Especifica que se obtiene un bloqueo de tabla durante la operación de importación masiva. Varios clientes pueden cargar una tabla simultáneamente si la tabla no tiene índices y TABLOCK se especifica. De forma predeterminada, el comportamiento del bloqueo viene determinado por la opción de tabla table lock on bulk load. Al mantener un bloqueo durante la operación de importación masiva, se reduce la contención por bloqueos de la tabla y en algunos casos puede mejorarse notablemente el rendimiento. Para obtener información sobre las consideraciones de rendimiento, vea Consideraciones de rendimiento más adelante en este artículo.
En un índice de almacén de columnas, el comportamiento de bloqueo es diferente porque se divide internamente en varios conjuntos de filas. Cada subproceso carga datos exclusivamente en cada conjunto de filas tomando un bloqueo exclusivo (X) en el conjunto de filas que permite la carga de datos paralela con sesiones simultáneas de carga de datos. El uso de la opción hace que el subproceso tome un bloqueo exclusivo en la tabla (a diferencia del bloqueo de TABLOCK actualización masiva (BU) para conjuntos de filas tradicionales, lo que impide que otros subprocesos simultáneos carguen datos simultáneamente.
Opciones de formato de archivos de entrada
FORMAT
Se aplica a: SQL Server 2017 (14.x) y versiones posteriores.
Especifica un archivo de valores separados por comas conforme a la norma RFC 4180.
BULK INSERT bing_covid_19_data
FROM 'curated/covid-19/bing_covid-19_data/latest/bing_covid-19_data.csv'
WITH (DATA_SOURCE = 'pandemicdatalake', FORMAT = 'CSV');
En Fabric Data Warehouse, la BULK INSERT declaración soporta los mismos formatos que la COPY INTO sentencia, por lo que FORMAT = 'PARQUET' también es compatible.
CITA DE CAMPO
Se aplica a: SQL Server 2017 (14.x) y versiones posteriores.
Especifica un carácter que se va a usar como carácter de comilla en el archivo CSV. Si no se especifica, el carácter de comillas (") se usa como carácter de comilla, tal como se define en el estándar RFC 4180 .
FORMATFILE
Especifica la ruta de acceso completa de un archivo de formato. Un archivo de formato describe el archivo de datos que contiene respuestas almacenadas creado con la utilidad bcp en la misma tabla o vista.
BULK INSERT bing_covid_19_data
FROM 'curated/covid-19/bing_covid-19_data/latest/bing_covid-19_data.csv'
WITH (DATA_SOURCE = 'pandemicdatalake',
FORMATFILE = 'https://<data-lake>.blob.core.windows.net/public/curated/covid-19/bing_covid-19_data/latest/bing_covid-19_data.fmt');
Nota
Reemplace por <data-lake>.blob.core.windows.net una dirección URL adecuada.
Se debe usar el archivo de formato si:
- El archivo de datos contiene un número de columnas mayor o menor que la tabla o vista.
- Las columnas están en un orden diferente.
- Los delimitadores de columna varían.
- Hay otros cambios en el formato de los datos. Los archivos de formato se suelen crear con la utilidad bcp y se modifican con un procesador de texto si es necesario. Para más información, consulta la utilidad bcp y Crear un archivo de formato con bcp.
A partir de SQL Server 2017 (14.x), y en Azure SQL Database, format_file_path puede estar en Azure Storage.
FORMATFILE_DATA_SOURCE
Se aplica a: SQL Server 2017 (14.x) y versiones posteriores.
Especifica una fuente de datos externa nombrada que apunta a la ubicación de Azure Storage del archivo de formato para definir el esquema de los datos importados.
BULK INSERT bing_covid_19_data
FROM 'curated/covid-19/bing_covid-19_data/latest/bing_covid-19_data.csv'
WITH (
DATA_SOURCE = 'pandemicdatalake',
FORMATFILE = 'curated/covid-19/bing_covid-19_data/latest/bing_covid-19_data.fmt',
FORMATFILE_DATA_SOURCE = 'pandemicdatalake'
);
FIELDTERMINATOR
Especifica el terminador de campo que se va a usar y charwidechar los archivos de datos. El terminador de campo predeterminado es \t (tabulador). Para obtener más información, vea Especificar terminadores de campo y fila.
BULK INSERT bing_covid_19_data
FROM '/curated/covid-19/bing_covid-19_data/latest/bing_covid-19_data.csv'
WITH (DATA_SOURCE = 'pandemicdatalake', FIELDTERMINATOR = ',', FIRSTROW = 2);
ROWTERMINATOR
Especifica el terminador de fila que se va a usar char y widechar los archivos de datos.
BULK INSERT bing_covid_19_data
FROM '/curated/covid-19/bing_covid-19_data/latest/bing_covid-19_data.csv'
WITH (DATA_SOURCE = 'pandemicdatalake', ROWTERMINATOR = '\r\n', FIRSTROW = 2);
El terminador de fila por defecto es \r\n (retorno de carro y carácter de nueva línea). Para obtener más información, vea Especificar terminadores de campo y fila.
Compatibilidad
BULK INSERT aplica la validación estricta de datos y las comprobaciones de datos de los datos leídos desde un archivo que podrían provocar un error en los scripts existentes cuando se ejecutan en datos no válidos. Por ejemplo, BULK INSERT comprueba que:
- Las representaciones nativas de los tipos de datos float o real son válidas.
- Los datos Unicode tienen una longitud de bytes uniforme.
Tipos de datos
Conversiones de tipos de datos de cadena a decimal
Las conversiones de tipo de datos string-to-decimal usadas en BULK INSERT siguen las mismas reglas que la función CONVERT de Transact-SQL, que rechaza las cadenas que representan valores numéricos que usan notación científica. Por lo tanto, BULK INSERT trata estas cadenas como valores no válidos e informa de errores de conversión.
Para solucionar este comportamiento, use un archivo de formato para la importación masiva de datos de tipo float con notación científica en una columna con valores decimales. En el archivo de formato, describa explícitamente la columna como de datos real o float. Para obtener más información sobre estos tipos de datos, consulte float y real.
Los archivos de formato representan datos real como el tipo de datos SQLFLT4 y datos float como el tipo de datos SQLFLT8. Para información sobre archivos que no son en formato XML, consulte Especificar tipo de almacenamiento de archivo usando bcp.
Ejemplo de importación de un valor numérico que utiliza notación científica
En este ejemplo se utiliza la siguiente tabla en la base de datos bulktest:
CREATE TABLE dbo.t_float
(
c1 FLOAT,
c2 DECIMAL (5, 4)
);
El usuario desea importar masivamente datos en la tabla t_float. El archivo de datos, C:\t_float-c.dat, contiene datos float de notación científica; por ejemplo:
8.0000000000000002E-2 8.0000000000000002E-2
Al copiar este ejemplo, tenga en cuenta los diferentes editores de texto y codificaciones que guardan los caracteres de tabulación (\t) como espacios. Se espera un carácter de tabulación más adelante en este ejemplo.
Sin embargo, BULK INSERT no se pueden importar estos datos directamente en t_float, porque su segunda columna, c2, usa el tipo de datos decimal . Por lo tanto, es necesario un archivo de formato. El archivo de formato debe asignar los datos float con notación científica al formato decimal de la columna c2.
El siguiente archivo de formato usa el tipo de datos SQLFLT8 para asignar el segundo campo de datos a la segunda columna:
<?xml version="1.0"?>
<BCPFORMAT xmlns="http://schemas.microsoft.com/sqlserver/2004/bulkload/format" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<RECORD>
<FIELD ID="1" xsi:type="CharTerm" TERMINATOR="\t" MAX_LENGTH="30" />
<FIELD ID="2" xsi:type="CharTerm" TERMINATOR="\r\n" MAX_LENGTH="30" />
</RECORD>
<ROW>
<COLUMN SOURCE="1" NAME="c1" xsi:type="SQLFLT8" />
<COLUMN SOURCE="2" NAME="c2" xsi:type="SQLFLT8" />
</ROW>
</BCPFORMAT>
Para utilizar este archivo de formato (con el nombre de archivo C:\t_floatformat-c-xml.xml) para importar los datos de prueba en la tabla de prueba, emita la siguiente instrucción de Transact-SQL:
BULK INSERT bulktest.dbo.t_float
FROM 'C:\t_float-c.dat'
WITH (FORMATFILE = 'C:\t_floatformat-c-xml.xml');
Importante
Azure SQL Database y Fabric Data Warehouse solo soportan lectura desde URI (por ejemplo, Azure Storage).
Tipos de datos para importar o exportar masivamente documentos SQLXML
Para importar o exportar de forma masiva datos SQLXML, utilice uno de los tipos de datos siguientes en el archivo de formato:
| Tipo de datos | Efecto |
|---|---|
| SQLCHAR o SQLVARCHAR | Los datos se envían a la página de códigos del cliente o a la página de códigos implícita por la intercalación. El efecto es el mismo que especificar el DATAFILETYPE = 'char' sin especificar un archivo de formato. |
| SQLNCHAR o SQLNVARCHAR | Los datos se envían como datos Unicode. El efecto es el mismo que especificar el DATAFILETYPE = 'widechar' sin especificar un archivo de formato. |
| SQLBINARY o SQLVARBIN | Los datos se envían sin realizar ninguna conversión. |
Comentarios
Para una comparación de la BULK INSERT sentencia, la INSERT ... SELECT * FROM OPENROWSET(BULK...) instrucción y el bcp comando, véase Importación y exportación masiva de datos.
Para obtener información sobre cómo preparar los datos para la importación masiva, consulte Preparación de datos para la exportación o importación masiva.
La BULK INSERT instrucción se puede ejecutar dentro de una transacción definida por el usuario para importar datos en una tabla o vista. Opcionalmente, para usar varias coincidencias para la importación masiva de datos, una transacción puede especificar la BATCHSIZE cláusula en la BULK INSERT instrucción . Si se revierte una transacción de varios lotes, cada lote que se envía a SQL Server se revierte.
Interoperabilidad
Importa datos desde un archivo CSV
A partir de SQL Server 2017 (14.x), BULK INSERT admite el formato CSV, al igual que Azure SQL Database.
Antes de SQL Server 2017 (14.x), las operaciones de importación masiva SQL Server no admiten archivos de valores separados por comas (CSV). Sin embargo, en algunos casos se puede utilizar un archivo de valores separados por comas (CSV) como archivo de datos para una importación masiva de datos en SQL Server. Para obtener información sobre los requisitos para importar datos desde un archivo de datos CSV, consulte Preparación de datos para la exportación o importación masiva.
Comportamiento del registro
Para obtener información sobre cuándo se registran las operaciones de inserción de filas realizadas por la importación masiva en SQL Server en el registro de transacciones, consulte Requisitos previos para el registro mínimo en la importación masiva. En Azure SQL Database no se admite el registro mínimo.
Limitaciones
Cuando se usa un archivo de formato con BULK INSERT, solo puede especificar hasta 1024 campos. Es el mismo número máximo de columnas permitido en una tabla. Si usa un archivo de formato con BULK INSERT con un archivo de datos que contiene más de 1024 campos, BULK INSERT genera el error 4822. La utilidad bcp no tiene esta limitación, por lo que para los archivos de datos que contienen más de 1024 campos, use BULK INSERT sin un archivo de formato o use el comando bcp .
Consideraciones de rendimiento
Si el número de páginas que van a vaciarse en un único lote supera un umbral interno, podría producirse un examen completo del grupo de búferes para identificar qué páginas se han de vaciar cuando el lote se confirme. Este examen completo puede afectar de forma desfavorable al rendimiento de la importación masiva. Un caso en el que es probable que se supere el umbral interno se produce cuando un grupo de búferes grande se combina con un subsistema de E/S lento. Para evitar desbordamientos de búfer en máquinas grandes, no use la TABLOCK sugerencia (que quita las optimizaciones masivas) o use un tamaño de lote más pequeño (que conserva las optimizaciones masivas).
Debe probar con varios tamaños de lote con la carga de datos para averiguar lo que funciona mejor en su caso. Recuerde que el tamaño de lote tiene implicaciones de reversión parcial. Si se produce un error en el proceso y antes de usarlo BULK INSERT de nuevo, es posible que tenga que realizar un trabajo manual adicional para quitar una parte de las filas que se insertaron correctamente, antes de que se produzca un error.
Con Azure SQL Database, considere la posibilidad de aumentar temporalmente el nivel de rendimiento de la base de datos o la instancia antes de la importación si va a importar un gran volumen de datos.
Seguridad
Delegación de cuentas de seguridad (suplantación)
Si un usuario utiliza un inicio de sesión de SQL Server , se utilizará el perfil de seguridad de la cuenta de proceso de SQL Server . Un inicio de sesión que use autenticación de SQL Server no se puede autenticar fuera del Motor de base de datos. Por lo tanto, cuando un inicio de sesión inicia un BULK INSERT inicio de sesión mediante la autenticación de SQL Server, la conexión a los datos se realiza mediante el contexto de seguridad de la cuenta de proceso de SQL Server (la cuenta usada por el servicio motor de base de datos de SQL Server).
Para leer correctamente los datos de origen, debe conceder a la cuenta usada por el motor de base de datos de SQL Server acceso a los datos de origen. Por el contrario, si un usuario de SQL Server ha iniciado sesión mediante autenticación de Windows, el usuario solo puede leer los archivos a los que la cuenta de usuario tiene acceso, independientemente del perfil de seguridad del proceso de SQL Server .
Al ejecutar la BULK INSERT instrucción mediante sqlcmd o osql, desde un equipo, insertar datos en SQL Server en un segundo equipo y especificar un data_file en el tercer equipo mediante una ruta de acceso UNC, es posible que reciba un error 4861.
Para resolver este error, use la autenticación de SQL Server y especifique un inicio de sesión de SQL Server que use el perfil de seguridad de la cuenta del proceso de SQL Server, o bien configure Windows para habilitar la delegación de la cuenta de seguridad. Para obtener información acerca de cómo habilitar una cuenta de usuario para que sea de confianza para la delegación, vea la Ayuda de Windows.
Para obtener más información sobre esto y otras consideraciones de seguridad para usar BULK INSERT, vea Usar BULK INSERT o OPENROWSET(BULK...) para importar datos a SQL Server.
Cuando importes desde Azure Storage y los datos no son públicos (acceso anónimo), crea una CREDENCIAL CON ALCANCE DE BASE DE DATOS basada en una clave SAS cifrada con una clave maestra de base de datos (DMK), y luego crea una fuente de base de datos externa para usar en tu BULK INSERT comando.
Como alternativa, cree una CREDENCIAL CON ÁMBITO DE BASE DE DATOS basada en MANAGED IDENTITY para autorizar solicitudes de acceso a datos en cuentas de almacenamiento no públicas. Al usar MANAGED IDENTITY, Azure Storage debe conceder permisos a la identidad gestionada de la instancia añadiendo el rol integrado de control de acceso basado en roles (RBAC) de Azure Storage Blob Data Contributor, que proporciona acceso de lectura/escritura a la identidad gestionada para los contenedores necesarios de Azure Storage. Azure SQL Managed Instance dispone de una identidad administrada asignada por el sistema, y también puede tener una o varias identidades administradas asignadas por el usuario. Puede usar identidades administradas asignadas por el sistema o identidades administradas asignadas por el usuario para autorizar las solicitudes. Para la autorización, se usaría la default identidad de la instancia administrada (es decir, la identidad administrada asignada por el usuario principal o la identidad administrada asignada por el sistema si no se especifica la identidad administrada asignada por el usuario). Para un ejemplo, véase Importar datos de un archivo en Azure Storage.
Importante
La Identidad Gestionada se aplica a Azure SQL, y SQL Server 2025 (17.x) y versiones posteriores.
Permisos
Los permisos siguientes se aplican a la ubicación en la que los datos se importan masivamente (el destino).
Requiere INSERT permisos y ADMINISTER BULK OPERATIONS . En Azure SQL Database INSERT y ADMINISTER DATABASE BULK OPERATIONS se requieren permisos.
ADMINISTER BULK OPERATIONS los permisos o el rol bulkadmin no se admiten para SQL Server en Linux. Solo sysadmin puede realizar inserciones masivas para SQL Server en Linux.
Además, ALTER TABLE se requiere el permiso si se cumple una o varias de las condiciones siguientes:
Existen restricciones y no se especifica la
CHECK_CONSTRAINTSopción .La deshabilitación de restricciones es el comportamiento predeterminado. Para comprobar las restricciones explícitamente, use la
CHECK_CONSTRAINTSopción .Los desencadenadores existen y no se especifica la
FIRE_TRIGGERopción .De forma predeterminada, los desencadenadores no se activan. Para activar desencadenadores explícitamente, use la
FIRE_TRIGGERopción .Use la opción para importar el
KEEPIDENTITYvalor de identidad del archivo de datos.
Ejemplos
Los ejemplos de código de este artículo usan la base de datos de ejemplo de AdventureWorks2025 o AdventureWorksDW2025, que puede descargar de la página principal de Ejemplos de Microsoft SQL Server y proyectos de comunidad.
Importante
Azure SQL Database y Fabric Warehouse solo soportan la lectura desde Azure Storage.
Un. Use canalizaciones para importar datos de un archivo
En el siguiente ejemplo se importa información detallada de pedidos en la tabla AdventureWorks2022.Sales.SalesOrderDetail desde un archivo de datos especificado utilizando una canalización (|) como el terminador de campo y |\n como el terminador de fila.
BULK INSERT AdventureWorks2022.Sales.SalesOrderDetail
FROM 'f:\orders\lineitem.tbl'
WITH (FIELDTERMINATOR = ' |', ROWTERMINATOR = ' |\n');
B. Use el argumento FIRE_TRIGGERS
En el ejemplo siguiente se especifica el argumento FIRE_TRIGGERS.
BULK INSERT AdventureWorks2022.Sales.SalesOrderDetail
FROM 'f:\orders\lineitem.tbl'
WITH (FIELDTERMINATOR = ' |', ROWTERMINATOR = ':\n', FIRE_TRIGGERS);
C. Use el salto de línea como terminador de fila
En el siguiente ejemplo se importa un archivo que utiliza el salto de línea como terminador de fila, igual que en una salida de UNIX:
DECLARE @bulk_cmd AS VARCHAR (1000);
SET @bulk_cmd = 'BULK INSERT AdventureWorks2022.Sales.SalesOrderDetail
FROM ''<drive>:\<path>\<filename>''
WITH (ROWTERMINATOR = ''' + CHAR(10) + ''')';
EXECUTE (@bulk_cmd);
Nota
En Windows, \n se reemplaza automáticamente por \r\n.
D. Especificar una página de código
En este ejemplo se muestra cómo especificar una página de código.
BULK INSERT MyTable
FROM 'D:\data.csv'
WITH (CODEPAGE = '65001', DATAFILETYPE = 'char', FIELDTERMINATOR = ',');
E. Importa datos desde un archivo CSV
En el ejemplo siguiente se muestra cómo especificar un archivo CSV, omitir el encabezado (primera fila), utilizar ; como terminador de campo y 0x0a como terminador de línea:
BULK INSERT Sales.Invoices
FROM '\\share\invoices\inv-2016-07-25.csv'
WITH (
FORMAT = 'CSV',
FIRSTROW = 2,
FIELDQUOTE = '\',
FIELDTERMINATOR = ';',
ROWTERMINATOR = '0x0a'
);
El siguiente ejemplo muestra cómo especificar un archivo CSV en formato UTF-8 (utilizando un CODEPAGE de 65001), omitiendo el encabezado (primera fila), utilizando ; como terminador de campo y 0x0a como terminador de línea:
BULK INSERT Sales.Invoices
FROM '\\share\invoices\inv-2016-07-25.csv'
WITH (
CODEPAGE = '65001',
FORMAT = 'CSV',
FIRSTROW = 2,
FIELDQUOTE = '\',
FIELDTERMINATOR = ';',
ROWTERMINATOR = '0x0a'
);
F. Importar datos de un archivo en Azure Storage
Cargar datos desde un CSV en Azure Storage con un token SAS
El siguiente ejemplo muestra cómo cargar datos desde un archivo CSV en una ubicación de Azure Storage en la que hayas creado una Firma de Acceso Compartido (SAS). La ubicación de Azure Storage está configurada como una fuente de datos externa, lo que requiere una credencial con alcance de base de datos usando una clave SAS cifrada mediante un DMK en la base de datos de usuarios.
Nota
Asegúrate de que no tienes un inicio ? en el token SAS, y que al menos tienes permiso de lectura sobre el objeto que debe cargarse srt=o&sp=r, y que el periodo de caducidad es válido (todas las fechas están en tiempo UTC).
(Opcional) No se requiere un DMK si no se requiere a DATABASE SCOPED CREDENTIAL , porque el blob está configurado para acceso público (anónimo).
CREATE MASTER KEY ENCRYPTION BY PASSWORD = '<password>';
(Opcional) A DATABASE SCOPED CREDENTIAL no es necesario porque el blob está configurado para acceso público (anónimo).
No incluyas un adelantado ? en el token SAS. Asegúrate de tener al menos permiso de lectura sobre el objeto que debe cargarse (srt=o&sp=r), y que el periodo de caducidad sea válido (todas las fechas están en hora UTC).
CREATE DATABASE SCOPED CREDENTIAL MyAzureBlobStorageCredential
WITH IDENTITY = 'SHARED ACCESS SIGNATURE',
SECRET = '******srt = sco&sp = rwac&se = 2017-02-01T00:55:34Z&st = 2016-12-29T16:55:34Z***************';
Nota
CREDENTIAL no es necesario si un blob está configurado para acceso público (anónimo).
CREATE EXTERNAL DATA SOURCE MyAzureBlobStorage
WITH (
TYPE = BLOB_STORAGE,
LOCATION = 'https://****************.blob.core.windows.net/invoices',
CREDENTIAL = MyAzureBlobStorageCredential
);
BULK INSERT Sales.Invoices
FROM 'inv-2017-12-08.csv'
WITH (DATA_SOURCE = 'MyAzureBlobStorage');
Cargar datos desde un CSV en Azure Storage con una identidad gestionada
El siguiente ejemplo muestra cómo usar el BULK INSERT comando para cargar datos desde un archivo CSV en una ubicación de Azure Storage usando Identidad Gestionada. La ubicación de Azure Storage está configurada como una fuente de datos externa.
(Opcional) No se requiere un DMK si no se requiere a DATABASE SCOPED CREDENTIAL , porque el blob está configurado para acceso público (anónimo).
CREATE MASTER KEY ENCRYPTION BY PASSWORD = '<password>';
(Opcional) A DATABASE SCOPED CREDENTIAL no es obligatorio, porque el blob está configurado para acceso público (anónimo):
CREATE DATABASE SCOPED CREDENTIAL MyAzureBlobStorageCredential
WITH IDENTITY = 'Managed Identity';
Concede el rol de Contribuidor de Datos de Blob de Almacenamiento, para proporcionar acceso de lectura/escritura a la identidad gestionada para los contenedores necesarios de Azure Storage.
Nota
CREDENTIAL no es necesario si un blob está configurado para acceso público (anónimo).
CREATE EXTERNAL DATA SOURCE MyAzureBlobStorage
WITH (
TYPE = BLOB_STORAGE,
LOCATION = 'https://****************.blob.core.windows.net/invoices',
CREDENTIAL = MyAzureBlobStorageCredential
);
BULK INSERT Sales.Invoices
FROM 'inv-2017-12-08.csv'
WITH (DATA_SOURCE = 'MyAzureBlobStorage');
Importante
La identidad gestionada se aplica a SQL Server 2025 (17.x) y versiones posteriores, así como a Azure SQL.
G. Importa datos de un archivo en Azure Storage y especifica un archivo de error
El siguiente ejemplo muestra cómo cargar datos desde un archivo CSV en una ubicación de Azure Storage, que está configurada como una fuente de datos externa, y también especifica un archivo de error. Necesita una credencial con ámbito de base de datos mediante una firma de acceso compartido. Si se ejecuta en Azure SQL Database, la ERRORFILE opción debe ir acompañada de ERRORFILE_DATA_SOURCE, de lo contrario la importación podría fallar con error de permisos. El archivo especificado en ERRORFILE no debe existir en el contenedor.
BULK INSERT Sales.Invoices
FROM 'inv-2017-12-08.csv'
WITH (
DATA_SOURCE = 'MyAzureInvoices',
FORMAT = 'CSV',
ERRORFILE = 'MyErrorFile',
ERRORFILE_DATA_SOURCE = 'MyAzureInvoices'
);
Para ejemplos completos BULK INSERT que incluyen la configuración de la credencial y la fuente de datos externa, véase Ejemplos de acceso masivo a datos en Azure Storage.
Más ejemplos
Se proporcionan otros ejemplos de BULK INSERT en estos artículos:
- Ejemplos de importación y exportación masiva de documentos XML
- Mantén los valores de identidad al importar datos en masa
- Mantener los valores nulos o predeterminados durante la importación masiva
- Especificar terminadores de campo y fila
- Utiliza un archivo de formato para importar datos en masa
- Utilizar el formato de carácter para importar o exportar datos
- Utiliza el formato nativo para importar o exportar datos
- Utiliza el formato de caracteres Unicode para importar o exportar datos
- Utilizar el formato nativo Unicode para importar o exportar datos
- Utiliza un archivo de formato para saltar una columna de la tabla
- Utiliza un archivo de formato para mapear columnas de tabla a campos de archivo de datos