BULK Datos Masivos SQL Server 2012

You might also like

Download as doc, pdf, or txt
Download as doc, pdf, or txt
You are on page 1of 29

Stack Overflow is a question and answer site for professional and enthusiast programmers.

It's 100% free, no registration required.

Sql Bulk insert XML format file with


double quotes in terminator
I'm trying to insert some data into a table from a csv document which has all of the
fields delimited with ""

ie.

APPLICANTID,NAME,CONTACT,PHONENO,MOBILENO,FAXNO,EMAIL,ADDR1,ADDR2,AD
DR3,STATE,POSTCODE
"3","Snoop Dogg","Snoop Dogg","411","","","","411 High Street","USA
","","USA", "1111" "4","LL Cool J","LL Cool J","","","","","5 King
Street","","","USA","1111"

I am using an xml format file to try and overcome the "" delimiters as I believe I
would have to update the data again after importing to remove the inital " if it did
not.

My format file looks like the following:


up
vote 4 <?xml version="1.0"?>
down <BCPFORMAT
vote xmlns="http://schemas.microsoft.com/sqlserver/2004/bulkload/format"
favori xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<RECORD>
te <FIELD ID="1" xsi:type="NCharTerm" TERMINATOR='",'
1 MAX_LENGTH="12"/>
<FIELD ID="2" xsi:type="CharTerm" TERMINATOR=',"'
COLLATION="Latin1_General_CI_AS"/>
<FIELD ID="3" xsi:type="CharTerm" TERMINATOR=',"'
COLLATION="Latin1_General_CI_AS"/>
<FIELD ID="4" xsi:type="CharTerm" TERMINATOR=',"'
COLLATION="Latin1_General_CI_AS"/>
<FIELD ID="5" xsi:type="CharTerm" TERMINATOR=',"'
COLLATION="Latin1_General_CI_AS"/>
<FIELD ID="6" xsi:type="CharTerm" TERMINATOR=',"'
COLLATION="Latin1_General_CI_AS"/>
<FIELD ID="7" xsi:type="CharTerm" TERMINATOR=',"'
COLLATION="Latin1_General_CI_AS"/>
<FIELD ID="8" xsi:type="CharTerm" TERMINATOR=',"'
COLLATION="Latin1_General_CI_AS"/>
<FIELD ID="9" xsi:type="CharTerm" TERMINATOR=',"'
COLLATION="Latin1_General_CI_AS"/>
<FIELD ID="10" xsi:type="CharTerm" TERMINATOR=',"'
COLLATION="Latin1_General_CI_AS"/>
<FIELD ID="11" xsi:type="CharTerm" TERMINATOR=',"'
COLLATION="Latin1_General_CI_AS"/>
<FIELD ID="12" xsi:type="CharTerm" TERMINATOR="\r\n"
COLLATION="Latin1_General_CI_AS"/>
</RECORD>
<ROW>
<COLUMN SOURCE="1" NAME="APPLICANTID" xsi:type="SQLINT"/>
<COLUMN SOURCE="2" NAME="NAME" xsi:type="SQLNVARCHAR"/>
<COLUMN SOURCE="3" NAME="CONTACT" xsi:type="SQLNVARCHAR"/>
<COLUMN SOURCE="4" NAME="PHONENO" xsi:type="SQLNVARCHAR"/>
<COLUMN SOURCE="5" NAME="MOBILENO" xsi:type="SQLNVARCHAR"/>
<COLUMN SOURCE="6" NAME="FAXNO" xsi:type="SQLNVARCHAR"/>
<COLUMN SOURCE="7" NAME="EMAIL" xsi:type="SQLNVARCHAR"/>
<COLUMN SOURCE="8" NAME="ADDR1" xsi:type="SQLNVARCHAR"/>
<COLUMN SOURCE="9" NAME="ADDR2" xsi:type="SQLNVARCHAR"/>
<COLUMN SOURCE="10" NAME="ADDR3" xsi:type="SQLNVARCHAR"/>
<COLUMN SOURCE="11" NAME="STATE" xsi:type="SQLNVARCHAR"/>
<COLUMN SOURCE="12" NAME="POSTCODE" xsi:type="SQLCHAR"/>
</ROW>
</BCPFORMAT>

and I am running the import with the following:

BULK INSERT [PracticalDB].dbo.applicant


FROM 'C:\temp.csv'
WITH (KEEPIDENTITY, FORMATFILE='C:\temp.xml', FIRSTROW = 2)

I am getting the error:

Msg 4864, Level 16, State 1, Line 1 Bulk load data conversion error (type mismatch
or invalid character for the specified codepage) for row 2, column 1
(APPLICANTID).

for all of the rows.

I have tried various different combinations for the terminator including using:

TERMINATOR="&quot;,"
TERMINATOR="\","
TERMINATOR='","
TERMINATOR='\","

and none of them seem to work.

Is there a correct way to escape the " so that it will be parsed correctly, assuming that
that is my problem here.

sql-server xml bulkinsert bcp


edited Dec 16 '11 at 6:00 asked Dec 16 '11 at 5:55
shareimprove this question
marc_s Daniel Powell
352k56622807 4,21722766
add a comment

3 Answers
active oldest votes
up vote Ok so I figured it out!
10 down
vote You can use ' instead of " when you are defining the xml attributes ie
accepted TERMINATOR='', then you can use the " within them without worrying.

Also I needed to eat the first " with a field so the other columns could be parsed
correctly. This ended up with the format file

<?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='"' />
<FIELD ID="2" xsi:type="CharTerm" TERMINATOR='","' />
<FIELD ID="3" xsi:type="CharTerm" TERMINATOR='","' />
<FIELD ID="4" xsi:type="CharTerm" TERMINATOR='","' />
<FIELD ID="5" xsi:type="CharTerm" TERMINATOR='","' />
<FIELD ID="6" xsi:type="CharTerm" TERMINATOR='","' />
<FIELD ID="7" xsi:type="CharTerm" TERMINATOR='","' />
<FIELD ID="8" xsi:type="CharTerm" TERMINATOR='","' />
<FIELD ID="9" xsi:type="CharTerm" TERMINATOR='","' />
<FIELD ID="10" xsi:type="CharTerm" TERMINATOR='","' />
<FIELD ID="11" xsi:type="CharTerm" TERMINATOR='","' />
<FIELD ID="12" xsi:type="CharTerm" TERMINATOR='","' />
<FIELD ID="13" xsi:type="CharTerm" TERMINATOR='"\r\n' />
</RECORD>
<ROW>
<COLUMN SOURCE="2" NAME="APPLICANTID" xsi:type="SQLNVARCHAR"/>
<COLUMN SOURCE="3" NAME="NAME" xsi:type="SQLNVARCHAR"/>
<COLUMN SOURCE="4" NAME="CONTACT" xsi:type="SQLNVARCHAR"/>
<COLUMN SOURCE="5" NAME="PHONENO" xsi:type="SQLNVARCHAR"/>
<COLUMN SOURCE="6" NAME="MOBILENO" xsi:type="SQLNVARCHAR"/>
<COLUMN SOURCE="7" NAME="FAXNO" xsi:type="SQLNVARCHAR"/>
<COLUMN SOURCE="8" NAME="EMAIL" xsi:type="SQLNVARCHAR"/>
<COLUMN SOURCE="9" NAME="ADDR1" xsi:type="SQLNVARCHAR"/>
<COLUMN SOURCE="10" NAME="ADDR2" xsi:type="SQLNVARCHAR"/>
<COLUMN SOURCE="11" NAME="ADDR3" xsi:type="SQLNVARCHAR"/>
<COLUMN SOURCE="12" NAME="STATE" xsi:type="SQLNVARCHAR"/>
<COLUMN SOURCE="13" NAME="POSTCODE" xsi:type="SQLCHAR"/>
</ROW>
</BCPFORMAT>

Where the first field is just a throw away one to remove the first " and the other fields all
separate on "," and the final separates on "(newline)

answered Dec 16 '11 at 6:17

shareimprove this answer

Daniel Powell
4,21722766
Thanks! This is the best solution I have found to a very common problem.
     I've created a similar xml file for my import and it works perfectly. –  Derek
Tomes Mar 18 '12 at 22:30
add a comment
Tip: if only some of the fields are doubleqouted, then use the openrowset
version of the bulk insert, and doing so, you can manipulate the field content
coming from the input file before inserting into the target table.

In the manipulation you can do anything with the field content, e.g. removing
double-quotes. The effect on the performance is not mentioned here, I have no
measures regarding this.
up vote 2
down vote edited Oct 27 '12 at answered Jan 27 '12 at
14:32 13:34

shareimprove this
answer

SchmitzIT Estevez
4,61292346 12114
add a comment
Tip: if your CSV file don't have consistent format, for example ON THE SAME
COLUMN some of the values are doubleqouted and some not than this blog will
help you do it in an easy way (this is a continue to Estevez's tip as using the
up vote openrowset is just the last step) http://ariely.info/Blog/tabid/83/EntryId/122/Using-
1 down Bulk-Insert-to-import-inconsistent-data-format-using-pure-T-SQL.aspx
vote  there is a WIKI at http://social.technet.microsoft.com/wiki based on this blog
if you prefer to read from Microsoft site.

shareimprove this answer


Cargar archivo *.txt o *csv a una tabla en SQL
Server 2008
27 05 2009

Hola muchachos y empezando con mis pequeñas ayudas técnicas les preparé un pequeño
material para que puedas cargar un archivo de texto en formato *.txt o *.csv a una tabla en
SQL Server 2008, bueno comencemos :D

Primero vamos al SQL Server Management Studio

Vamos a crear una base de datos simple y una tabla nueva para realizar nuestro ejemplo,
entonces hacemos esto:

Primero crear una base de datos en este caso DB_APRENDIZAJE


Ya con nuestra base de datos creada ahora necesitamos abrir una nueva consulta, solo
debemos hacer click arriba en el botón “New Query”

Ahora para crear una tabla ejecutamos (Sombreando + Botón execute) el siguiente código:

USE DB_APRENDIZAJE
--Para utilizar la Base de datos

CREATE TABLE TIENDA (IdTienda varchar(50), Nombre varchar(50),


Ciudad varchar (25), Factura decimal(7,3))
--Para Crear la Tabla

Con nuestra tabla ya creada podemos verla con la siguiente consulta:

SELECT * FROM TIENDA


--Muestra la tabla

Como puedes ver ya esta lista nuestra tabla y aunque vacía ya sabemos que tipos de datos
se van a poder insertar, esto es importante porque al cargar los datos de origen desde
nuestro archivo de texto o csv estos tienen que coincidir con los de destino, ahora creamos
nuestro archivo de texto con los datos que vamos a ingresar.
Ya tenemos nuestro archivo y para este ejemplo lo he guardado en mi partición D:\ en una
carpeta BASES DE DATOS asi que podré acceder a este fácilmente, para cargar el archivo
a nuestra tabla ejecutamos el siguiente código en nuestra hojita de consultas:

BULK

INSERT TIENDA
FROM 'D:\BASES DE DATOS\DATOS.txt'--Ruta archivo
WITH

( FIELDTERMINATOR = ',', --separa campos


ROWTERMINATOR = '\n' ) --separa filas

GO

Ejecutamos la consulta y vemos que los cambios se han realizado, podemos comprobar si
los datos están cargados mediante un nuevo SELECT

SELECT * FROM TIENDA


--Muestra la tabla
Con esto acabamos muchachos, espero que les sirva… saludos :D

About these ads


Cargando...

Relacionado

Modificar nombres de Tablas, Columnas, Indices y TipoDatoAlias en Transact - SQLEn


"Curso SQL Server 2008"

Creación de Tablas e Integridad referencial en Transact SQL ServerEn "Curso SQL Server
2008"

Tipos de Join en T-SQL y como usarlos...En "Curso SQL Server 2008"

« Visual Studio 2010 & Net Framework 4 Beta 1 ya disponible!! Conociendo la


arquitectura de .Net e introducción al SQL Sever 2008 »

Acciones

  Comments RSS
  Trackback
Information

 Fecha : mayo 27, 2009


 Etiquetas: Curso SQL Server 2008, SQL Server 2008, Transact - SQL, Tutoriales
 Categorías : Uncategorized

32 responses
29 05 2009

Irineo Chavarria (01:58:57) :

Para empezar con SQL Server 2008, muy ilustrativo el ejemplo y muy accesible el
tutorial.

Saludos

Responder
30 07 2009

Gladys Villablanca (14:43:48) :

Qué pasa cuando quiero insertar valores con Ñs, o acentos… cómo puedo definir el
lenguage a utilizar por el bulk

Responder
5 08 2009

huamanpunlay (21:08:53) :

Esto en si es la forma de subir archivos planos para cargar la tabla, las definiciones
de Ñs y acentos dependen del tipo de datos para eso revisa informacion sobre texto
Unicode y no Unicode

Responder
4 08 2009

guss_69 (01:57:25) :

Gracias por tu ayuda, estaba atorado en como subir un archivo.

Responder
2 09 2009

juan (16:33:40) :
que pasa cuando el archivo plano es de longitud fija? es decir no tiene caracter
especial que delimite las columnas,,… hay alguna manera de hacerlo?

Responder
3 09 2009

huamanpunlay (18:55:32) :

Bueno si te refieres a que no tiene un caracter especial como por ejemplo una coma,
quizas puede ser solo un espacio vacío y en el fieldterminator simplemente iria un
espacio en blanco (” “) así donde se vea el espacio se reconocerá como separador,
realiza tus pruebas y si deseas mas documentacion aquí en technet o msdn
encuentras la sintaxis completa …saludos :D
http://technet.microsoft.com/es-es/library/ms188365.aspx

Responder
15 10 2009

Ignacio Navarro (22:19:18) :

Hola huamanpunlay,

Muy buen tutorial, te felicito.

Tengo la misma duda que Juan, ¿como le haces cuando no hay ningún delimitador,
ni siquiera espacio, sino que son longitudes constantes, pero incluso en un mismo
archivo de texto plano hay distintas separaciones, por ejemplo, los renglones 1 a 5
se separarán de cierta forma y los renglones 6 a 10 de otra forma?.

Gracias por el apoyo

Saludos

Responder
17 10 2009

huamanpunlay (07:37:14) :

Hola cuando no hay delimitador puedes incluir ahi también un espacio en blanco o
como sea que este separado el campo y bueno en lo demás ya eso viene por cuenta
de la limpieza de tu data y los formatos que puedes obtenerlas, tambien podrías
hacer uso del asistente del SQL Server o sino generar un proyecto de Integration y
hacerlo a nivel de ETL pero esto ya es otro tema, como se dice tenemos que
ingeniarnosla porque un método así específico no te podría dar la verdad…
saludos :D

Responder
21 10 2009

Ignacio Navarro (03:54:45) :

Huamanpunlay, muchas gracias por el consejo,

Fijate que estaba pensando en usar el SSIS, pero esta herramienta solo viene en las
versiones SQLServer de paga, la versión Express no la tiene. Y creo que el cliente
al que le estamos haciendo el desarrollo no tiene SQL de paga, sabes si el proyecto
creado en SSIS correría en un servidor con SQL 2008 Express o en su defecto en
SQL de paga pero versión 2000?

Te envío un saludo y gracias de nuevo

Responder
22 10 2009

huamanpunlay (19:49:00) :

Mmm si el problema que tenemos los desarrolladores de BI jeje…bueno si el cliente


no tiene una version de Paga tu podrías usar la versión que tengas instalada en este
caso yo para estudio uso la versión Developer de SQL Server 2008 bajo licencia de
Microsoft Dreamspark (licencia para estudiantes) es una version completa pero no
es para uso comercial, quizas puedas hacer tu ETL en esta y luego copiar tu data o
la tablita ya lista a tu servidor de trabajo creo que eso no es ilegal jeje almenos eso
espero…saludos :D

Responder
27 10 2009

Ignacio Navarro (17:54:48) :

Jejeje, gracias por el tip.

Te felicito de nuevo por tu blog.


Continúa subiendo mas consejos.

Saludos

30 10 2009

Maik (18:24:41) :

Hola, muy buen tutorial

Me he topado con un problema


Cuando importo datos con acento me los cambia por otros caracteres, pasa lo mism
con la ñ

Alguno sabe como solucionarlo si es que ya se toparon con esto

Muchas gracias a todos

Responder
30 10 2009

Maik (18:27:22) :

Olvide mencionar que mi Collation es Modern_Spanish_CI_AS y la BD que uso es


version 2005

de antemano muchas gracias

Responder
31 10 2009

huamanpunlay (05:04:34) :

Bueno depende del archivo que guardes…suponiendo que es un *.txt:


– Al momento de guardar el documento debajo del nombre del archivo y del tipo
está la línea “Codificación” que como verás por defecto esta en ANSI, cambiale el
valor a “Unicode”
– Ejecuta tu mismo código BULK y así los acentos y las Ñs se verán bien´
Listo!
*A propósito, te saldrá una advertencia bueno esto se soluciona configurando el
DATAFILETYPE =’widechar’ de esta manera:

select * from dbo.Empleado

Bulk insert dbo.empleado


from ‘D:\Datos.txt’

With

(
FieldTerminator = ‘,’,
rowterminator =’\n’,
DataFileType =’widechar’ )

Saludos :D

Responder
5 12 2009
NOHANY (02:57:11) :

graciazz!!!!

Responder
15 12 2009

Christian (14:56:16) :

ME SALVASTE LA VIDA! GRACIAS!

Responder
27 01 2010

Ignacio Navarro (17:33:10) :

Hola huamanpunlay,

Nuevamente busco tu consejo.

Tengo que cargar una archivo de Excel 2003 (.xls) a la BD, sabes como hacelo
utilizando BULK INSERT?. El problema es que no me permiten que se convierta
primero a CSV porque si ese fuera el caso, aplico exactamente tu Tutorial.

Ojalá me puedas ayudar.

Responder
30 01 2010

Veronica (09:10:01) :

Hola…de casualidad el procedimiento que haces es el mismo para subir un archivo


con formato de word o jpg.
Es que tengo que subir o cargar un archivo en un campo que tengo en mi base de
datos en sqlserver2000…

Responder
31 01 2010

huamanpunlay (02:19:06) :

No en realidad son para datos y archivos planos …saludos

Responder
26 04 2010

Damián (02:22:03) :
Hola!! muy buena ayuda.
Pero , que pasa si en el archivo tengo filas duplicadas..como hago para que bulk
insert me genere un archivo con estas iconsistencias, pero igual me inserte aquellas
filas que estan bien. Muchas Gracias!!

Responder
3 06 2010

Elias (22:20:43) :

ESTA BUENO … EXCLELENT

Responder
9 06 2010

Irving (20:50:50) :

Como le hago si el archivo es de excel?

Responder
16 06 2010

huamanpunlay (08:17:52) :

Utiliza el Wizard del SQL Server es muy facil!

Responder
22 10 2010

fer (14:50:13) :

Probaron con utilizar el agente de exportacion – importacion de sql 2008 es muy


completo y simple, pero no sirve si la tabla destino tiene datos. Saludos

Responder
10 12 2010

GrM@n (02:52:13) :

Gracias me sera muy util en mi hora de examen, terminare primero que los demas :)

Responder
25 10 2011

Harry Son (12:13:23) :


Muy bueno el artículo. Me gustaría que esto se hiciera automáticamente cada vez
que ingreso un nuevo fichero en la carpeta de origen, o bien cada cierto tiempo para
los que que hayan llegado nuevos. ¿Alguien sabría decirme como hacerlo?

Responder
13 02 2012

Karolain (03:09:56) :

hola me encanto tu articulo, y me funciona para algunas tablas pero cuando tengo
que meter fechas … llega el problema . Con el insert sencillo la fecha la coloco
INSERT INTO US VALUES (‘david’ , ’28-12-2011′ ) y me inserta super. Pero
cuando ejecuto tus sentencias me sale un error en la fecha… existe alguna manera
de manejar esto?

Responder
14 02 2012

esteban (20:55:57) :

Muchas gracias desde Chile.

Responder
15 02 2012

Benito (19:26:24) :

Hola, muy bueno tu articulo, lo he utilizado mucho.


Actualmente se me presentó un problema, fijate que tengo como delimitador de fila
5 espacio en blanco, sin embargo tengo una columna que en ciertas ocaciones tiene
5 caracteres y en otras ocasiones es de 6.
Cuando es de 5 no hay problemas porque el delimitador de fila es de 5 espacios en
blanco, pero cuando es de 6 caracteres el delimitador pasa a ser de 4 caracteres en
blaco.
Como puedo hacer para resolver este inconveniente???
Cabe recalcar que no puedo usar el wizard por que esto está automatizado y se
realiza por query a través de un botón en una interfaz gráfica.

Responder
28 08 2012

William (06:23:01) :

gracias por el tuto, cabalmente andaba buscando como cargar un archivo .csv,
gracias nuevamente

Responder
25 07 2013
DaNi Alexis (03:45:00) :

Excelente… Me Sirvio de mucha ayuda Gracias

Responder
5 08 2013

Agustín (22:34:21) :

Excelente Material Fácil y Didáctico, aprueba de wns.


Gracias

Responder

BULK INSERT (Transact-SQL)


SQL Server 2014
Otras versiones

Importa un archivo de datos en una tabla o vista de base de datos con un formato especificado por
el usuario en SQL Server

Se aplica a: SQL Server (desde SQL Server 2008 hasta la versión actual).

Convenciones de sintaxis de Transact-SQL (Transact-SQL)

Sintaxis
BULK INSERT
   [ database_name . [ schema_name ] . | schema_name . ] [ table_name |
view_name ]
      FROM 'data_file'
     [ WITH
    (
   [ [ , ] BATCHSIZE = batch_size ]
   [ [ , ] CHECK_CONSTRAINTS ]
   [ [ , ] CODEPAGE = { 'ACP' | 'OEM' | 'RAW' | 'code_page' } ]
   [ [ , ] DATAFILETYPE =
      { 'char' | 'native'| 'widechar' | 'widenative' } ]
   [ [ , ] FIELDTERMINATOR = 'field_terminator' ]
   [ [ , ] FIRSTROW = first_row ]
   [ [ , ] FIRE_TRIGGERS ]
   [ [ , ] FORMATFILE = 'format_file_path' ]
   [ [ , ] KEEPIDENTITY ]
   [ [ , ] KEEPNULLS ]
   [ [ , ] KILOBYTES_PER_BATCH = kilobytes_per_batch ]
   [ [ , ] LASTROW = last_row ]
   [ [ , ] MAXERRORS = max_errors ]
   [ [ , ] ORDER ( { column [ ASC | DESC ] } [ ,...n ] ) ]
   [ [ , ] ROWS_PER_BATCH = rows_per_batch ]
   [ [ , ] ROWTERMINATOR = 'row_terminator' ]
   [ [ , ] TABLOCK ]
   [ [ , ] ERRORFILE = 'file_name' ]
    )]

Argumentos
database_name

Es el nombre de la base de datos en la que reside la tabla o vista especificada. Si no


se especifica, es la base de datos actual.

schema_name

Es 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 vista especificada, SQL Server devuelve un
mensaje de error y se cancela la operación de importación masiva.

table_name

Es 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 acerca de las restricciones para
la carga de datos en vistas, vea INSERT (Transact-SQL).

' data_file '

Es la ruta de acceso completa al archivo de datos que contiene los datos que se van
a importar en la tabla o vista especificada. BULK INSERT puede importar datos
desde un disco (incluidos una ubicación de red, disquete, disco duro, etc.).

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, \\SystemX\DiskZ\Sales\
update.txt.

BATCHSIZE =batch_size

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 acerca de consideraciones de
rendimiento, vea la sección "Comentarios" más adelante en este tema.

CHECK_CONSTRAINTS

Especifica que deben comprobarse todas las restricciones de la tabla o vista de destino
durante la operación de importación masiva. Sin la opción CHECK_CONSTRAINTS, se
omiten las restricciones CHECK y FOREIGN KEY, y, después de la operación, la restricción
sobre la tabla se marca como de no confianza.

Nota
Las restricciones UNIQUE y PRIMARY KEY se aplican siempre. Cuando se
importa en una columna de caracteres definida con la restricción NOT NULL,
BULK INSERT inserta una cadena vacía cuando no hay 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 revalidar la
restricción puede superar del costo de aplicar restricciones CHECK a los datos
incrementales.

Una situación en la que quizá desee que las restricciones estén deshabilitadas
(comportamiento predeterminado) se produce cuando los datos de entrada contienen
filas que infringen las restricciones. Con las restricciones CHECK deshabilitadas, puede
importar los datos y utilizar después instrucciones Transact-SQL para quitar los datos no
válidos.

Nota
La opción MAXERRORS no se aplica a la comprobación de restricciones.
CODEPAGE = { 'ACP' | 'OEM' | 'RAW' | 'code_page' }

Especifica la página de códigos de los datos incluidos en el archivo de datos.


CODEPAGE solo es pertinente si los datos contienen columnas de tipo char,
varchar o text con valores de caracteres mayores que 127 o menores que 32.

Nota
Microsoft recomienda especificar un nombre de intercalación para cada columna de
un archivo de formato.
Valor de
Descripción
CODEPAGE
Las columnas con el tipo de datos char, varchar o text se
ACP convierten de la página de códigos ANSI/Microsoft Windows
(ISO 1252) a la página de códigos de SQL Server.
Las columnas con los tipos de datos char, varchar o text se
OEM (valor
convierten de la página de códigos OEM del sistema a la
predeterminado)
página de códigos de SQL Server.
No se realiza ninguna conversión de una página de códigos a
RAW
otra; se trata de la opción más rápida.
Número específico de una página de códigos; por ejemplo, 850.

code_page Importante
SQL Server no admite la página de códigos 65001
(codificación UTF-8).
DATAFILETYPE = { 'char' | 'native' | 'widechar' | 'widenative' }

Especifica que BULK INSERT realiza la operación de importación con el valor de tipo de
archivo de datos especificado.

Valor de
Todos los datos representados en:
DATAFILETYPE
Formato de caracteres.
char (valor
predeterminado) Para obtener más información, vea Usar el formato de
caracteres para importar o exportar datos (SQL Server).
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.

native El valor native ofrece una alternativa de mayor rendimiento al


valor char.

Para obtener más información, vea Usar el formato nativo


para importar o exportar datos (SQL Server).
Caracteres Unicode.

widechar Para obtener más información, vea Usar el formato de


caracteres Unicode para importar o exportar datos (SQL
Server).
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 de widenative
mediante la importación masiva de datos desde SQL Server
con la utilidad bcp.
El valor widenative ofrece una alternativa de mayor
rendimiento a widechar. Si el archivo de datos contiene
caracteres extendidos ANSI, especifique widenative.

Para obtener más información, vea Usar el formato nativo


Unicode para importar o exportar datos (SQL Server).
FIELDTERMINATOR ='field_terminator'

Especifica el terminador de campo que se va a utilizar para archivos de datos de tipo


char y widechar. El terminador de campo predeterminado es \t (tabulador). Para
obtener más información, vea Especificar terminadores de campo y de fila (SQL
Server).

FIRSTROW =first_row

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 comienza en 1.

Nota
El atributo FIRSTROW no está pensado para saltar los encabezados de columna. La
instrucción BULK INSERT no permite omitir los encabezados. Al omitir filas,
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.
FIRE_TRIGGERS

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 se definen
desencadenadores para operaciones INSERT en la tabla de destino, se activan para
cada lote completado.

Si no se especifica FIRE_TRIGGERS, no se ejecuta ningún desencadenador de


inserción.

FORMATFILE ='format_file_path'

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. 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 obtener más información, vea bcp (utilidad).

KEEPIDENTITY

Especifica que se utilizará el valor o valores de identidad del archivo de datos


importado para la columna de identidad. Si no se especifica KEEPIDENTITY, los
valores de identidad de esta columna se comprueban pero no se importan y SQL
Server asigna automáticamente valores únicos basados en los valores de
inicialización y de 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 obtener más información,
vea DBCC CHECKIDENT (Transact-SQL).

Para obtener más información acerca de cómo mantener los valores de identidad,
vea Mantener valores de identidad al importar datos de forma masiva (SQL Server).

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 obtener más información, vea Mantener valores
NULL o usar valores predeterminados durante la importación masiva (SQL Server).

KILOBYTES_PER_BATCH = kilobytes_per_batch

Especifica el número aproximado de kilobytes (KB) de datos por lote como


kilobytes_per_batch. De forma predeterminada, el valor de
KILOBYTES_PER_BATCH es desconocido. Para obtener información acerca de
consideraciones de rendimiento, vea la sección "Comentarios" más adelante en este
tema.

LASTROW=last_row

Especifica el número de la última fila que se va a cargar. El valor predeterminado es


0, que indica la última fila del archivo de datos especificado.

MAXERRORS = max_errors

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.
Nota
La opción MAX_ERRORS no se aplica para comprobar restricciones ni para
convertir tipos de datos money y bigint.
ORDER ( { column [ ASC | DESC ] } [ ,... n ] )

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
siguiendo otro criterio que no sea el orden de una clave de índice clúster, o si no hay
ningún índice clúster en la tabla, la cláusula ORDER se pasa por alto. 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. Para optimizar las operaciones de importación masiva,
SQL Server también se valida que los datos importados estén ordenados.

Es un marcador de posición que indica que se pueden especificar varias columnas.

ROWS_PER_BATCH =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 el valor > 0) el servidor utiliza
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 acerca de consideraciones de rendimiento, vea la
sección "Comentarios" más adelante en este tema.

ROWTERMINATOR ='row_terminator'

Especifica el terminador de fila que se va a utilizar para archivos de datos de tipo


char y widechar. El terminador de fila predeterminado es \r\n (carácter de nueva
línea). Para obtener más información, vea Especificar terminadores de campo y de
fila (SQL Server).

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 ésta no tiene
índices y se especifica TABLOCK. 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 acerca de consideraciones
de rendimiento, vea la sección "Comentarios" más adelante en este tema.

ERRORFILE ='file_name'

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".

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. Este archivo hace referencia a cada fila del archivo de
errores y proporciona diagnósticos de errores. Tan pronto como se corrigen los
errores, se pueden cargar los datos.

Compatibilidad
BULK INSERT aplica una estricta validación y comprobación de los datos leídos de un
archivo que pueden dar lugar a errores 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 tipos de datos de cadena a decimal utilizadas en BULK INSERT


siguen las mismas reglas que la función CONVERT de Transact-SQL, que rechaza las
cadenas que representan valores numéricos con notación científica. Por lo tanto, BULK
INSERT trata esas cadenas como valores no válidos y genera 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 acerca de estos tipos de datos, vea float y real (Transact-
SQL).

Nota
Los archivos de formato representan los datos real como el tipo de datos SQLFLT4 y los
datos float como el tipo de datos SQLFLT8. Para obtener información acerca de los
archivos de formato no XML, vea Especificar el tipo de almacenamiento en archivo
mediante bcp (SQL Server).
Ejemplo de importación de un valor numérico que utiliza notación científica

En este ejemplo se utiliza la siguiente tabla:

CREATE TABLE 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 con notación científica; por ejemplo:

8.0000000000000002E-28.0000000000000002E-2

No obstante, BULK INSERT no puede importar estos datos directamente en t_float, ya que
su segunda columna, c2, utiliza 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 utiliza 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
Transact-SQL:

BULK INSERT bulktest..t_float


FROM 'C:\t_float-c.dat' WITH (FORMATFILE='C:\t_floatformat-c-xml.xml');
GO

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


Los datos se envían en la página de códigos del cliente o en la
SQLCHAR o página de códigos implícita en la intercalación). El efecto es el
SQLVARCHAR mismo que si se especifica DATAFILETYPE ='char' sin especificar
un archivo de formato.
Los datos se envían como Unicode. El efecto es el mismo que si se
SQLNCHAR o
especifica DATAFILETYPE = 'widechar' sin especificar un
SQLNVARCHAR
archivo de formato.
SQLBINARY o
Los datos se envían sin realizar ninguna conversión.
SQLVARBIN

Comentarios generales
Para obtener una comparación de la instrucción BULK INSERT, la instrucción INSERT ...
SELECT * FROM OPENROWSET(BULK...) y el comando bcp, vea Importar y exportar
datos de forma masiva (SQL Server).

Para obtener información sobre cómo preparar los datos para la importación masiva, vea
Preparar los datos para exportar o importar de forma masiva (SQL Server).

La instrucción BULK INSERT se puede ejecutar en una transacción definida por el usuario
para importar datos en una tabla o una vista. Opcionalmente, para utilizar varias
coincidencias para la importación masiva de datos, una transacción puede especificar la
cláusula BATCHSIZE en la instrucción BULK INSERT. Si una transacción de varios lotes
se revierte, cada lote que la transacción ha enviado a SQL Server se revierte.

Interoperabilidad
Importar datos desde un archivo CSV

Las operaciones de importación masiva de SQL Server no admiten los 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 acerca de los requisitos para importar datos
de un archivo de datos CSV, vea Preparar los datos para exportar o importar de forma
masiva (SQL Server).

Comportamiento del registro


Para obtener información acerca de cuándo se registran en el registro de transacciones las
operaciones de inserción de filas que se efectúan durante la importación masiva, vea
Requisitos previos para el registro mínimo durante la importación masiva.

Restricciones
Cuando se usa un archivo de formato con BULK INSERT, solo se puede especificar un
máximo de 1024 campos. Es el mismo número máximo de columnas permitido en una
tabla. Si usa BULK INSERT con un archivo de datos que contenga 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 contengan más de 1024 campos 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 los desbordamientos del búfer en equipos grandes, no
utilice la sugerencia TABLOCK (que quita la optimización masiva) o use un tamaño de lote
menor (que la preserva).

Dado que los equipos varían, es recomendable que pruebe varios tamaños de lote con la
carga de datos para averiguar lo que funciona mejor en su caso.

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 mediante la autenticación de SQL
Server no puede autenticarse fuera del motor de base de datos. Por tanto, cuando un inicio
de sesión mediante la autenticación de SQL Server inicia un comando BULK INSERT, la
conexión con los datos se realiza utilizando el contexto de seguridad de la cuenta de
proceso de SQL Server (la cuenta que utiliza el servicio del motor de base de datos de SQL
Server). Para leer correctamente los datos de origen, debe conceder acceso a los datos de
origen a la cuenta utilizada por el motor de base de datos de SQL Server. En cambio, si un
usuario de SQL Server inicia sesión con la autenticación de Windows, el usuario solo
puede leer los archivos a los que tiene acceso la cuenta de usuario, independientemente del
perfil de seguridad del proceso de SQL Server.

Si al ejecutar la instrucción BULK INSERT utiliza sqlcmd u osql desde un equipo e inserta
datos en SQL Server en un segundo equipo y especifica data_file en un tercer equipo con
una ruta de acceso UNC, es posible que reciba el error 4861.
Para resolver este error, utilice la autenticación de SQL Server y especifique un inicio de
sesión de SQL Server, que utiliza 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 acerca de esta y otras consideraciones de seguridad en el uso
de BULK INSERT, vea Importar de forma masiva datos mediante BULK INSERT u
OPENROWSET(BULK...) (SQL Server).

Permisos

Se requieren los permisos INSERT y ADMINISTER BULK OPERATIONS. Además, es


necesario el permiso ALTER TABLE si se da una o varias de las siguientes circunstancias:

 Existen restricciones y no se ha especificado la opción CHECK_CONSTRAINTS.


Nota
El comportamiento predeterminado es deshabilitar las restricciones. Para comprobar
las restricciones CHECK explícitamente, utilice la opción
CHECK_CONSTRAINTS.
 Existen desencadenadores y no se ha especificado la opción FIRE_TRIGGER.

Nota
De manera predeterminada no se activan los desencadenadores. Para activar los
desencadenadores explícitamente, use la opción FIRE_TRIGGER.
 Se utiliza la opción KEEPIDENTITY para importar el valor de identidad de un
archivo de datos.

Ejemplos
A.Usar canalizaciones para importar datos de un archivo

En el siguiente ejemplo se importa información detallada de pedidos en la tabla


AdventureWorks2012.Sales.SalesOrderDetail desde un archivo de datos especificado
utilizando una canalización ( | ) como terminador de campo y |\n como terminador de fila.

BULK INSERT AdventureWorks2012.Sales.SalesOrderDetail


FROM 'f:\orders\lineitem.tbl'
WITH
(
FIELDTERMINATOR =' |',
ROWTERMINATOR =' |\n'
);

B.Usar el argumento FIRE_TRIGGERS

En el ejemplo siguiente se especifica el argumento FIRE_TRIGGERS.


BULK INSERT AdventureWorks2012.Sales.SalesOrderDetail
FROM 'f:\orders\lineitem.tbl'
WITH
(
FIELDTERMINATOR =' |',
ROWTERMINATOR = ':\n',
FIRE_TRIGGERS
);

C.Usar 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 varchar(1000);


SET @bulk_cmd = 'BULK INSERT AdventureWorks2012.Sales.SalesOrderDetail
FROM ''<drive>:\<path>\<filename>''
WITH (ROWTERMINATOR = '''+CHAR(10)+''')';
EXEC(@bulk_cmd);
Nota
Debido al modo en que Microsoft Windows trata los archivos de texto, (\n se reemplaza
automáticamente por \r\n).

Otros ejemplos

Se proporcionan otros ejemplos de uso de BULK INSERT en los temas siguientes:

 Ejemplos de importación y exportación de forma masiva documentos XML (SQL


Server)
 Mantener valores de identidad al importar datos de forma masiva (SQL Server)
 Mantener valores NULL o usar valores predeterminados durante la importación
masiva (SQL Server)
 Especificar terminadores de campo y de fila (SQL Server)
 Usar un archivo de formato para importar datos de forma masiva (SQL Server)
 Usar el formato de caracteres para importar o exportar datos (SQL Server)
 Usar el formato nativo para importar o exportar datos (SQL Server)
 Usar el formato de caracteres Unicode para importar o exportar datos (SQL Server)
 Usar el formato nativo Unicode para importar o exportar datos (SQL Server)
 Usar un archivo de formato para omitir una columna de tabla (SQL Server)
 Usar un archivo de formato para asignar columnas de tabla a campos de un archivo
de datos (SQL Server)
Vea también
Referencia

bcp (utilidad)
INSERT (Transact-SQL)
OPENROWSET (Transact-SQL)
sp_tableoption (Transact-SQL)

Conceptos

Importar y exportar datos de forma masiva (SQL Server)


Archivos de formato para importar o exportar datos (SQL Server)
Preparar los datos para exportar o importar de forma masiva (SQL Server)

You might also like