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

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

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

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

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

删除这些值最干净的方法是什么?我不希望对列表中的每条记录运行一个查询。
通常我会这样做,但在这种情况下,它会清空我的整个表(这不是我想要的)。

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

这是可行的,但我不认为它是一个“干净”的一个体面的大小列表

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

我在c应用程序中使用dapper,因此dapper代码段和原始sql都可以帮助我。作为一个对干净的sql的吸盘,我真的很好奇它有多干净。
非常感谢!

r55awzrz

r55awzrz1#

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

  1. public class Foo
  2. {
  3. public string Name { get; set; }
  4. public string Address { get; set; }
  5. }

然后删除多个,如下所示:

  1. var toDelete = new List<Foo>() {
  2. new Foo { Name = "Bob", Address = "1600 Pennsylvania Avenue, Washington DC" },
  3. new Foo { Name = "Maria", Address = "21B Baker St, London, England." }
  4. };
  5. conn.Execute(@"Delete From MyTable Where Name = @Name And Address = @Address", toDelete);
展开查看全部
dzjeubhm

dzjeubhm2#

对于sql

  1. DECLARE @JsonUserDetails VARCHAR(MAX) = '[
  2. {"strName":"Bob","strAddress":"1600 Pennsylvania Avenue, Washington DC"},
  3. {"strName":"Maria","strAddress":"21B Baker St, London, England."}]'
  4. DELETE T1 FROM MyTable T1
  5. INNER JOIN
  6. OPENJSON(@JsonUserDetails) WITH (strName varchar(35),strAddress varchar(50)) AS TEMP ON T1.Name = TEMP.strName AND TEMP.strAddress = T1.Address

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

相关问题