Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Korrekte Methode zum Löschen von über 2100 Zeilen (nach ID) mit Dapper

Eine Option besteht darin, eine temporäre Tabelle auf dem Server zu erstellen und dann die Massenladefunktion zu verwenden, um alle IDs auf einmal in diese Tabelle hochzuladen. Verwenden Sie dann eine Join-, EXISTS- oder IN-Klausel, um nur die Datensätze zu löschen, die Sie in Ihre temporäre Tabelle hochgeladen haben.

Massenladevorgänge sind ein gut optimierter Pfad in SQL Server und sollten sehr schnell sein.

Zum Beispiel:

  1. Führen Sie die Anweisung CREATE TABLE #RowsToDelete(ID INT PRIMARY KEY) aus
  2. Verwenden Sie einen Massenladevorgang, um Schlüssel in #RowsToDelete einzufügen
  3. Führen Sie DELETE FROM myTable where Id IN (SELECT ID FROM #RowsToDelete) aus
  4. Führen Sie DROP TABLE #RowsToDelte aus (Die Tabelle wird auch automatisch gelöscht, wenn Sie die Sitzung schließen)

(Angenommen, Dapper) Codebeispiel:

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