sql >> Base de Datos >  >> RDS >> Sqlserver

Método correcto para eliminar más de 2100 filas (por ID) con Dapper

Una opción es crear una tabla temporal en el servidor y luego usar la función de carga masiva para cargar todas las ID en esa tabla a la vez. Luego use una cláusula join, EXISTS o IN para eliminar solo los registros que cargó en su tabla temporal.

Las cargas masivas son una ruta bien optimizada en SQL Server y deberían ser muy rápidas.

Por ejemplo:

  1. Ejecute la instrucción CREATE TABLE #RowsToDelete(ID INT PRIMARY KEY)
  2. Utilice una carga masiva para insertar claves en #RowsToDelete
  3. Ejecute DELETE FROM myTable where Id IN (SELECT ID FROM #RowsToDelete)
  4. Ejecute DROP TABLE #RowsToDelte (la tabla también se eliminará automáticamente si cierra la sesión)

(Asumiendo Dapper) ejemplo de código:

conn.Open();

var columnName = "ID";

conn.Execute(string.Format("CREATE TABLE #{0}s({0} INT PRIMARY KEY)", columnName));

using (var bulkCopy = new SqlBulkCopy(conn))
{
    bulkCopy.BatchSize = ids.Count;
    bulkCopy.DestinationTableName = string.Format("#{0}s", columnName);

    var table = new DataTable();                    
    table.Columns.Add(columnName, typeof (int));
    bulkCopy.ColumnMappings.Add(columnName, columnName);

    foreach (var id in ids)
    {
        table.Rows.Add(id);
    }

    bulkCopy.WriteToServer(table);
}

//or do other things with your table instead of deleting here
conn.Execute(string.Format(@"DELETE FROM myTable where Id IN 
                                   (SELECT {0} FROM #{0}s", columnName));

conn.Execute(string.Format("DROP TABLE #{0}s", columnName));