SQL服务器:删除具有多个条件的多行

SQL Server : delete multiple rows with multiple conditions

我正在尝试从 SQL 服务器 table 中删除多行,匹配多个条件。

假设以下 table:

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

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

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

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

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

这行得通,但我不会考虑 'clean' 具有适当大小的列表

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,我真的很好奇这有多干净。

非常感谢!

对于SQL

DECLARE @JsonUserDetails VARCHAR(MAX) = '[
{"strName":"Bob","strAddress":"1600 Pennsylvania Avenue, Washington DC"},
{"strName":"Maria","strAddress":"21B Baker St, London, England."}]'

DELETE T1 FROM MyTable  T1
INNER JOIN 
OPENJSON(@JsonUserDetails) WITH (strName varchar(35),strAddress varchar(50)) AS TEMP ON T1.Name = TEMP.strName AND TEMP.strAddress = T1.Address

对于 Dapper 创建要删除的信息列表并序列化该列表并将该对象传递给 dapper 方法

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

通常,大多数事情最简洁的方式是最简单的。要做少量的项目,保持简单通常意味着一个循环。 Dapper 在参数中接受一个 IEnumerable,当它找到一个可枚举的对象时,它将使用不同的参数执行相同的命令 n 次。尽管这是到服务器的往返行程并且不适合 huge 数字,但它非常干净。这是它的样子,假设:

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