sql server:删除具有多个条件的多行

wn9m85ua  于 2021-07-24  发布在  Java
关注(0)|答案(2)|浏览(881)

我正在尝试从SQLServer表中删除多行,并在多个条件下进行匹配。
假设下表:

在我的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的吸盘,我真的很好奇它有多干净。
非常感谢!

r55awzrz

r55awzrz1#

这里有几件事要考虑。当您部署另一个sql字符串变体时,您不仅要生成一个新字符串(应用程序中的分配),还要在sql服务器上生成查询计划。每个排列都有自己的计划和缓存。这在小范围内可能不重要,但值得记住。
通常最干净的方式大多数事情都是最简单的。对于少量的项目,保持简单通常意味着一个循环。衣冠楚楚 IEnumerable 在参数中,当它找到一个可枚举项时,它将使用不同的参数执行相同的命令 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);
dzjeubhm

dzjeubhm2#

对于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方法

相关问题