Preguntas acerca de SQl BulkCopy

c# sqlbulkcopy sql-server sql-server-2005

Pregunta

Me pregunto ¿cómo se puede hacer una inserción masiva y una copia masiva al mismo tiempo? Tengo 2 tablas que deberían verse afectadas por la copia masiva, ya que ambas dependen una de la otra.

Así que quiero que si al insertar la tabla 1 muere un registro, se restaure y la tabla 2 nunca se actualice. Además, si la tabla 1 se inserta correctamente y la tabla 2 falla una actualización, la tabla 1 se retrotrae.

¿Se puede hacer esto con copia masiva?

Editar

Debería haber mencionado que estoy haciendo el inserto a granel aunque C #.

Se parece a esto, pero este es un ejemplo en el que he estado trabajando. Por lo tanto, no estoy seguro de si debo modificarlo para que sea un procedimiento almacenado (no estoy seguro de cómo se vería y cómo se vería el código C #)

private static void BatchBulkCopy()
{
    // Get the DataTable 
    DataTable dtInsertRows = GetDataTable();

    using (SqlBulkCopy sbc = new SqlBulkCopy(connectionString, SqlBulkCopyOptions.KeepIdentity))
    {
        sbc.DestinationTableName = "TBL_TEST_TEST";

        // Number of records to be processed in one go
        sbc.BatchSize = 500000;

        // Map the Source Column from DataTabel to the Destination Columns in SQL Server 2005 Person Table
        // sbc.ColumnMappings.Add("ID", "ID");
        sbc.ColumnMappings.Add("NAME", "NAME");

        // Number of records after which client has to be notified about its status
        sbc.NotifyAfter = dtInsertRows.Rows.Count;

        // Event that gets fired when NotifyAfter number of records are processed.
        sbc.SqlRowsCopied += new SqlRowsCopiedEventHandler(sbc_SqlRowsCopied);

        // Finally write to server
        sbc.WriteToServer(dtInsertRows);
        sbc.Close();
    }

}

Respuesta aceptada

Me pregunto ¿cómo se puede hacer una inserción masiva y una copia masiva al mismo tiempo? Tengo 2 tablas que deberían verse afectadas por la copia masiva, ya que ambas dependen una de la otra. Así que quiero que si al insertar la tabla 1 muere un registro, se restaure y la tabla 2 nunca se actualice. Además, si la tabla 1 se inserta correctamente y la tabla 2 falla una actualización, la tabla 1 se retrotrae. ¿Se puede hacer esto con copia masiva?

No, el objetivo principal de SqlBulkCopy es obtener datos en su base de datos lo más rápido posible. Simplemente volcará los datos en una sola tabla.

El caso de uso normal será luego inspeccionar esa tabla una vez que se haya importado, y comenzar a "dividir" esos datos y almacenarlos en el lugar que necesite ir, generalmente a través de un procedimiento almacenado (ya que los datos ya se encuentran en el servidor, y desea distribuirlo a otras tablas: no desea extraer todos los datos al cliente, inspeccionarlos y luego enviarlos al servidor una vez más).

SqlBulkCopy solo toma un montón de datos y los coloca en una tabla, muy rápidamente. No puede dividir los datos en varias tablas según criterios o condiciones.


Respuesta popular

Puede ejecutar inserciones masivas dentro de una transacción definida por el usuario, así que haga algo como esto:

BEGIN TRANSACTION MyDataLoad
BEGIN TRY

BULK INSERT ...

BULK INSERT ...

COMMIT TRANSACTJION MyDataLoad
END TRY
BEGIN CATCH
    ROLLBACK TRANSACTION
END CATCH

Sin embargo, puede haber otras formas de lograr lo que quieres. ¿Están las tablas vacías antes de insertarlas en masa? Cuando dice que las tablas dependen unas de otras, ¿quiere decir que hay restricciones de clave externa que desea que se cumplan?



Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué