A veces podemos tener la necesidad de insertarle miles o millones de filas a una tabla. Hay dos formas de hacer eso:

1. Mediante un ciclo WHILE o similar obtenemos las filas y las insertamos, algo como:

WHILE MiCondición
    Columna1 = Valor de la columna1
    Columna2 = Valor de la columna2
    INSERT INTO MiTabla
        VALUES(Columna1, Columna2)
END WHILE

Esto funciona pero tiene un gran problema: cuando hay muchas filas es lentísimo, exageradamente lento. Van a pasar horas y horas y aún continuará el proceso.

2. Guardando los datos en un archivo de texto y luego usar una sola vez el comando INSERT, de la siguiente manera:

a. Debes generar un archivo .TXT con todas las columnas de tamaño fijo. Eso significa que cada columna siempre debe tener la misma cantidad de caracteres. Por ejemplo, la columna CLI_NOMBRE siempre debe tener 40 caracteres, ni más ni menos.

b. El tamaño de cada columna debe ser exactamente el que se usará en la tabla de Firebird. O sea que si en Firebird la columna CLI_NOMBRE tendrá 40 caracteres en tu archivo de texto .TXT también debe tener 40 caracteres, ni más ni menos.

c. Las filas del archivo .TXT no deben terminar ni con un CHR(10) ni con un CHR(13) ni nada de eso o las columnas quedarán desfasadas.

d. En el Firebird debes crear una TABLA EXTERNA cuya cantidad de columnas y tamaño de cada columna coincida exactamente con las columnas del archivo .TXT

e. Esta tabla externa debe (por supuesto) relacionarse con el archivo .TXT, por ejemplo:

CREATE TABLE
    MiTablaExterna EXTERNAL 'C:\MisDatos\TEMP.TXT' (
        Columna1 Char(12)
        Columna2 Integer);

f. Para insertar las filas del archivo .TXT en la tabla externa del Firebird debes escribir algo como:

INSERT INTO
    TEMP
        (Columna1, Columna2)
    SELECT
        Columna1,
        Columna2
    FROM
        MiTablaExterna

Donde TEMP es una tabla normal del Firebird y MiTablaExterna es la tabla que relacionaste con el archivo .TXT

IMPORTANTE: Lastimosamente si ocurre algún error durante la inserción el Firebird no te dará suficiente información para saber cual es la columna problemática o el error que encontró. Por eso, una buena opción es que todas tus columnas sean de tipo CHAR, ya que eso te permitirá visualizar fácilmente donde está el error. Luego, mediante un CAST conviertes la columna del tipo CHAR al tipo que le corresponde.

OBSERVACIÓN: Un problema que encontré es que si cambias el orden de las columnas en tu tabla de Firebird, éste no se da por enterado, sigue usando el orden antiguo. Un error así puede ser muy insidioso así que debes tomarlo en cuenta.

A pesar de todo eso, la ventaja en velocidad que se obtiene es impresionante. Inserciones que usando el método uno pueden tardar 14 ó 15 horas, usando el método dos no llegan a los 20 minutos, así que sin dudas vale la pena hacer las inserciones con el método 2 cuando la cantidad de filas a insertar es grande.