Pregunta

Si ejecuto la siguiente consulta en SQL Server 2000 Query Analyzer:

BULK INSERT  OurTable 
FROM 'c:\OurTable.txt' 
WITH (CODEPAGE = 'RAW', DATAFILETYPE = 'char', FIELDTERMINATOR = '\t', ROWS_PER_BATCH = 10000, TABLOCK)

En un archivo de texto que se ajusta al esquema de OurTable para 40 líneas, pero luego cambia el formato de las últimas 20 líneas (digamos que las últimas 20 líneas tienen menos campos), recibo un error.Sin embargo, las primeras 40 líneas están comprometidas sobre la mesa.¿Hay algo en la forma en que llamo Bulk Insert que hace que no sea transaccional, o necesito hacer algo explícito para forzar su reversión en caso de falla?

¿Fue útil?

Solución

BULK INSERT actúa como una serie de individuos INSERT declaraciones y, por lo tanto, si el trabajo falla, no revierte todas las inserciones confirmadas.

Sin embargo, se puede colocar dentro de una transacción, por lo que podrías hacer algo como esto:

BEGIN TRANSACTION
BEGIN TRY
BULK INSERT  OurTable 
FROM 'c:\OurTable.txt' 
WITH (CODEPAGE = 'RAW', DATAFILETYPE = 'char', FIELDTERMINATOR = '\t', 
   ROWS_PER_BATCH = 10000, TABLOCK)
COMMIT TRANSACTION
END TRY
BEGIN CATCH
ROLLBACK TRANSACTION
END CATCH

Otros consejos

Puede revertir las inserciones.Para hacer eso, primero debemos entender dos cosas.

BatchSize

:No de filas a insertar por transacción.El valor predeterminado es entire Fichero de datos.Entonces un archivo de datos está en transacción.

Digamos que tiene un archivo de texto que tiene 10 filas y la fila 8 y la fila 7 tienen algunos detalles no válidos.Cuando inserta de forma masiva el archivo sin especificar o especificando el tamaño del lote, 8 de cada 10 se insertan en la tabla.La fila no válida, es decirEl octavo y el séptimo fallan y no se insertan.

Esto sucede porque el valor predeterminado MAXERRORS el recuento es 10 por transacción.

Según MSDN:

MAXERRORES:

Especifica el número máximo de errores de sintaxis permitidos en los datos antes de que se cancele la operación de importación masiva.Cada fila que no puede ser importado por la operación de importación masiva se omite y se cuenta como uno error.Si no se especifica max_errors, el valor predeterminado es 10.

Entonces, para fallar en las 10 filas, incluso si una no es válida, debemos configurar MAXERRORS=1 y BatchSize=1 Aquí también importa el número de BatchSize.

Si especifica BatchSize y la fila no válida está dentro del lote en particular, revertirá solo el lote en particular, no todo el conjunto de datos.Así que tenga cuidado al elegir esta opción.

Espero que esto resuelva el problema.

Como se indica en el BATCHSIZE definición de BULK INSERT en MSDN Library (http://msdn.microsoft.com/en-us/library/ms188365(v=sql.105).aspx) :

"Si esto falla, SQL Server confirma o revierte la transacción para cada lote..."

En conclusión, no es necesario agregar transaccionalidad a Bulk Insert.

Intente ponerlo dentro de una transacción definida por el usuario y vea qué sucede.En realidad, debería retroceder como lo describiste.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top