sql >> Database >  >> RDS >> Sqlserver

Correcte methode voor het verwijderen van meer dan 2100 rijen (op ID) met Dapper

Een optie is om een ​​tijdelijke tabel op de server te maken en vervolgens de bulklaadfunctie te gebruiken om alle ID's in één keer naar die tabel te uploaden. Gebruik vervolgens een join-, EXISTS- of IN-clausule om alleen de records te verwijderen die u naar uw tijdelijke tabel hebt geüpload.

Bulkladingen zijn een goed geoptimaliseerd pad in SQL Server en het zou erg snel moeten zijn.

Bijvoorbeeld:

  1. Voer de instructie uit CREATE TABLE #RowsToDelete(ID INT PRIMARY KEY)
  2. Gebruik een bulklading om sleutels in te voegen in #RowsToDelete
  3. Voer DELETE FROM myTable where Id IN (SELECT ID FROM #RowsToDelete)
  4. Voer DROP TABLE #RowsToDelte (de tafel wordt ook automatisch verwijderd als u de sessie sluit)

(Ervan uitgaande dat Dapper) codevoorbeeld:

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


  1. Standaard rijvolgorde voor selectiequery in oracle

  2. 1052:Kolom 'id' in veldlijst is dubbelzinnig

  3. Gegevens kopiëren van Salesforce naar SQL Server met Spectral Core

  4. Nieuwe functies van Oracle Database 20c