Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Método correto de excluir mais de 2100 linhas (por ID) com o Dapper


Uma opção é criar uma tabela temporária no servidor e usar o recurso de carregamento em massa para carregar todos os IDs nessa tabela de uma só vez. Em seguida, use uma cláusula join, EXISTS ou IN para excluir apenas os registros que você carregou em sua tabela temporária.

As cargas em massa são um caminho bem otimizado no SQL Server e devem ser muito rápidos.

Por exemplo:
  1. Execute a instrução CREATE TABLE #RowsToDelete(ID INT PRIMARY KEY)
  2. Use um carregamento em massa para inserir chaves em #RowsToDelete
  3. Execute DELETE FROM myTable where Id IN (SELECT ID FROM #RowsToDelete)
  4. Execute DROP TABLE #RowsToDelte (a tabela também será descartada automaticamente se você fechar a sessão)

(Assumindo Dapper) exemplo 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));