Если вам нужно будет продолжить обновление в будущем, вы можете попробовать это. Это несколько шагов, но это исправить и настроить его для будущего использования. (возможно, мне нужно проверить мой синтаксис - я больше схожу с ORacle, поэтому я, возможно, перепутал некоторые вещи, но логика должна работать.)
Сначала создайте таблицу, содержащую текущий уровень счетчика для каждой последовательности:
Create newTable (counter int, sequence varchar)
затем заполнить его с данными, как это: вставку в Новая_таблицу (выберите отчетливый 0 в качестве счетчика, последовательность из таблицы) Это позволит поставить каждый порядковый номер в таблице один раз и счетчик для каждого будет устанавливают на 0.
Затем создайте процедурное обновление с двумя заявлениями обновлений и немного дополнительной логика:
Create procedere counterUpdater(@sequence varchar) as
Declare l_counter as int;
select l_counter = counter
from newTable
where sequence = @sequence
--assuming you have a primary key in the table.
Declare @id int;
Select top 1 @id = id from table
where sequence = @sequence
and counter is null;
--update the table needing edits.
update table
set counter = l_counter + 1
where id = @id
--update the new table so you can keep track of which
--counter you are on
update newTable
set counter = l_counter + 1
where id = @id
Затем запустить прок, чтобы выполнить этот прок для каждой записи в таблице.
Теперь у вас должна быть «новая таблица», заполненная используемым в настоящее время счетчиком для каждой записи в таблице. Настройте свой процесс вставки так, чтобы в любое время, когда была создана новая запись, если она уже не указана в newTable, вы добавляете ее со счетом 1, и вы помещаете счет 1 в основную таблицу. Если последовательность существует, используйте вышеприведенную логику (увеличьте счетчик уже при использовании «newTable» и поместите его в качестве значения счетчика в newTable и mainTable.
В принципе, этот метод решил использовать память в место запроса существующей таблицы. Это станет очень полезным, если у вас есть большая таблица с большим количеством повторных порядковых номеров. Если ваши порядковые номера происходят только два или три раза, вы, вероятно, захотите сделать запрос, а затем, когда вы обновите, а затем позже вставки:
Во-первых, чтобы обновить: --find вне значение счетчика Объявите l_counter INT выберите l_counter = макс (счетчик) из таблицы, где сл uence = @sequence
update table
set counter = l_counter + 1
where id = (select top 1 id from table where sequence = @sequence
and counter is null)
затем запустите это для каждой записи.
Затем, при вставке новых записей:
Declare l_counter int
select l_counter = max(counter)
from table where sequence = @sequence
IsNull(l_counter, 0)
Insert into table
(counter, sequence) values (l_counter + 1, @sequence)
Опять же, я уверен, я смешанный и соответствие моего синтаксиса здесь, но понятия должны работать. Конечно, это подход «по одному», а не набор, поэтому он может быть немного неэффективным, но он будет работать.
Это для вставки или после факта? Если после того, как мы узнаем, что было добавлено первым? – Eric