首页 > 解决方案 > SQL Server:删除具有多个条件的多行

问题描述

我试图从 SQL Server 表中删除多行,匹配多个条件。

假设下表:

包含要删除的数据的表

在我的 C# 代码中,我有一个包含以下值的对象的列表。假设这个列表大小合适。

{Name = 'Bob', Address = '1600 Pennsylvania Avenue, Washington DC'},
{Name = 'Maria', Address = '21B Baker St, London, England.'}

删除这些值的最干净的方法是什么?我宁愿不对列表中的每条记录运行一个查询。

通常我会做这样的事情,但在这种情况下,它会清空我的整个表(这不是我想要的)。

DELETE FROM MyTable
WHERE Name IN ('Bob', 'Maria')
  AND Address IN ('1600 Pennsylvania Avenue, Washington DC', '21B Baker St, London, England.')

这行得通,但它不是我认为具有适当大小的列表的“干净”的东西

DELETE FROM MyTable
WHERE 
   (Name = 'Bob' AND Address = '1600 Pennsylvania Avenue, Washington DC') OR
   (Name = 'Maria' AND Address = '21B Baker St, London, England.')

我在我的 C# 应用程序中使用 Dapper,因此 Dapper 片段和原始 SQL 都可以帮助我。作为一个干净的 SQL 的傻瓜,我真的很好奇它有多干净。

非常感谢!

标签: c#sqlsql-serverdappersql-delete

解决方案


这里有几件事需要考虑。当您部署 SQL 字符串的另一个变体时,您不仅会生成新字符串(应用程序中的分配),还会生成 SQL 服务器上的查询计划。每个排列都有自己的计划和缓存。这在小范围内可能并不重要,但值得牢记。

通常最干净的方式是最简单的。要做少量的项目,保持简单通常意味着循环。Dapper 接受IEnumerable参数中的 an ,当它找到一个可枚举时,它将使用不同的参数n时间执行相同的命令。虽然这是到服务器的往返,对于大量的数字来说不是很好,但它非常干净。这是它的样子,假设:

public class Foo
{
    public string Name { get; set; }
    public string Address { get; set; }
}

然后你会像这样删除多个:

var toDelete = new List<Foo>() {
    new Foo { Name = "Bob", Address = "1600 Pennsylvania Avenue, Washington DC" },
    new Foo { Name = "Maria", Address = "21B Baker St, London, England." }
};

conn.Execute(@"Delete From MyTable Where Name = @Name And Address = @Address", toDelete);

推荐阅读