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:
- Führen Sie die Anweisung
CREATE TABLE #RowsToDelete(ID INT PRIMARY KEY)
aus - Verwenden Sie einen Massenladevorgang, um Schlüssel in
#RowsToDelete
einzufügen - Führen Sie
DELETE FROM myTable where Id IN (SELECT ID FROM #RowsToDelete)
aus - 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));