首页 > 解决方案 > 如何循环一次删除一行

问题描述

我想知道是否有一种方法可以重组以下 SQL,以便一次删除一行,而不是在一次批量操作中执行删除?原因是删除操作导致该表上的触发器执行,并且(在 USER_ID 有超过 1 行的情况下)试图将数据插入到另一个表中,该表具有日期时间戳作为键并且同时(到毫秒)正在尝试插入并导致重复键插入错误。

DELETE ORDERS
FROM LINE_ORDER ORDERS
INNER JOIN LINE_ORDER_XREF B ON B.OPRID = ORDERS.USER_ID
WHERE B.USERID = 'SYSACCT'

当时的想法是,如果将每一行作为自己的事务单独删除,那么这将使每个日期时间戳记都是唯一的。在这种情况下,删除操作的数量将很少,额外的处理时间不是问题。是否可以构建一些循环或使用游标?LINE_ORDER(USER_ID和) 中的主 ID 列USER_ROLE是 varchar 列,所以我不相信我可以增加它。

USER_ID     USER_ROLE   DYNAMIC_SW
11000_600   E_SAML      N
11000_602   E_SAML      N
11000_602   SUPRV       N
11000_604   E_PRO       N
11000_605   E_SAML      N

标签: sqlsql-serversql-server-2012

解决方案


好吧,您可以TOP为此目的使用:

DELETE o
FROM (SELECT TOP (1) o.*
      FROM LINE_ORDER o INNER JOIN
           LINE_ORDER_XREF lox
           ON lox.OPRID = o.USER_ID
      WHERE lox.USERID = 'SYSACCT'
     ) o;

然后,您需要将其嵌入循环中以删除所有匹配值。


推荐阅读