Мне удалось решить эту проблему, используя следующий код:
DECLARE @client VARCHAR(2)
DECLARE @voucher_no INT
DECLARE @sequence_no INT
DECLARE @id INT
DECLARE cursor_results CURSOR FOR
WITH T AS
(
SELECT *, COUNT(*) OVER (PARTITION BY client, voucher_no, sequence_no) AS cnt
FROM table_a
)
SELECT t.client, t.voucher_no, t.sequence_no,t.id
FROM T AS t
WHERE t.cnt > 1
AND agrtid IN (0002, 0003, 0005, 0007, 0009, 0011)
ORDER BY t.client, t.voucher_no, t.sequence_no DESC
OPEN cursor_results
FETCH NEXT FROM cursor_results INTO @client, @voucher_no, @sequence_no, @id
WHILE @@FETCH_STATUS = 0
BEGIN
DECLARE @new_sequence_no INT = (SELECT MAX(sequence_no) + 1 FROM table_a WHERE client = @client AND voucher_no = @voucher_no)
UPDATE table_a
SET sequence_no = @new_sequence_no,
last_update = GETDATE(),
user_id = 'USR'
WHERE id = @id
AND client = @client
AND voucher_no = @voucher_no
FETCH NEXT FROM cursor_results INTO @client, @voucher_no, @sequence_no, @id
END
CLOSE cursor_results
DEALLOCATE cursor_results
Хотя это, вероятно, не лучший способ решения этой проблемы, использование курсора позволяет мне просматривать записи и обновлятьих по отдельности, прежде чем перейти к следующему.
Установка @new_sequence_no таким образом также гарантировала, что я получаю правильный MAX (sequence_no) + 1 для записи, на которой я был в то время, а не все дубликатыполучая MAX (sequence_no) + 1 для первой записи.