Как перебрать Удалить по одной строке за раз - PullRequest
0 голосов
/ 24 апреля 2019

Мне интересно, есть ли способ реструктурировать приведенный ниже 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 и 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

Ответы [ 2 ]

0 голосов
/ 16 мая 2019

Вы можете попробовать это:

DECLARE @i INT=
(
    SELECT ORDERS
    FROM LINE_ORDER ORDERS
         INNER JOIN LINE_ORDER_XREF B ON B.OPRID = ORDERS.USER_ID
    WHERE B.USERID = 'SYSACCT'
);
DECLARE @count INT= 1;
WHILE(@count <= @i)
    BEGIN
        DELETE TOP (1)
        ORDERS
        FROM LINE_ORDER ORDERS
             INNER JOIN LINE_ORDER_XREF B ON B.OPRID = ORDERS.USER_ID
        WHERE B.USERID = 'SYSACCT';
        SET @count = @count + 1;
    END;
0 голосов
/ 24 апреля 2019

Ну, вы можете использовать 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;

Затем вам нужно вставить это в цикл, чтобы удалить все совпадающие значения.

...