Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Méthode correcte de suppression de plus de 2100 lignes (par ID) avec Dapper

Une option consiste à créer une table temporaire sur le serveur, puis à utiliser la fonction de chargement en bloc pour télécharger tous les ID dans cette table en une seule fois. Utilisez ensuite une jointure, une clause EXISTS ou IN pour supprimer uniquement les enregistrements que vous avez chargés dans votre table temporaire.

Les chargements en bloc sont un chemin bien optimisé dans SQL Server et il devrait être très rapide.

Par exemple :

  1. Exécutez l'instruction CREATE TABLE #RowsToDelete(ID INT PRIMARY KEY)
  2. Utilisez un chargement groupé pour insérer des clés dans #RowsToDelete
  3. Exécuter DELETE FROM myTable where Id IN (SELECT ID FROM #RowsToDelete)
  4. Exécuter DROP TABLE #RowsToDelte (le tableau sera également supprimé automatiquement si vous fermez la session)

Exemple de code (en supposant que Dapper) :

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));