使用参数化IN语句批量删除,如DELETE FROM Users WHERE Id IN (@id0,@id1),避免逐条执行提升效率。

在C#中执行数据库的批量删除操作,核心是提高效率并避免性能问题。直接逐条删除会带来大量往返通信和事务开销,因此应采用批量处理方式。以下是常用方法及注意事项。
将多个ID拼成参数化查询,通过
IN
示例:
string sql = "DELETE FROM Users WHERE Id IN ({0})";
var ids = new int[] { 1, 2, 3, 4, 5 };
var parameters = string.Join(",", ids.Select((id, index) => "@id" + index));
var commandText = string.Format(sql, parameters);
using (var cmd = new SqlCommand(commandText, connection))
{
    for (int i = 0; i < ids.Length; i++)
    {
        cmd.Parameters.AddWithValue("@id" + i, ids[i]);
    }
    cmd.ExecuteNonQuery();
}
注意:SQL Server对
IN
将待删ID先插入临时表或通过表值参数传入,再用
JOIN
步骤:
// 构造DataTable
var table = new DataTable();
table.Columns.Add("Id", typeof(int));
foreach (var id in ids)
{
    table.Rows.Add(id);
}
using (var cmd = new SqlCommand("DELETE u FROM Users u INNER JOIN @IdsToDelete t ON u.Id = t.Id", connection))
{
    var param = cmd.Parameters.AddWithValue("@IdsToDelete", table);
    param.SqlDbType = SqlDbType.Structured;
    param.TypeName = "dbo.IntList"; // 自定义表类型
    cmd.ExecuteNonQuery();
}
前提:需在数据库中创建对应的表值类型:
CREATE TYPE dbo.IntList AS TABLE (Id INT)
即使使用批量删除,若数据量极大(如百万级),仍可能引发长时间锁表或事务日志暴涨。
建议分批提交,例如每次删1000条:
while (true)
{
    using (var cmd = new SqlCommand(
        "DELETE TOP (1000) FROM Users WHERE Status = 'Deleted'", connection))
    {
        int affected = cmd.ExecuteNonQuery();
        if (affected == 0) break; // 没有更多数据
    }
    // 可选:延时减轻系统压力
    Thread.Sleep(50);
}
这样可减少单次事务影响,便于监控进度。
基本上就这些。选择方法取决于数据量和系统要求。中小批量用IN加参数,大批量优先考虑TVP或分批处理,关键是安全、高效、可控。
以上就是如何用C#执行数据库的批量删除操作?注意什么?的详细内容,更多请关注php中文网其它相关文章!
 
                        
                        每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
 
                Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号