2015-07-28 3 views
1

У меня есть хранимая процедура, в которой я делаю более одной «вставки в select» в ту же таблицу. Внутри хранимой процедуры я хочу добавить прогрессивный номер к каждой добавляемой записи, начиная с 1. Чтобы было ясно, в первой «вставить в выборку» моего сохраненного я добавлю 5 записей в свою таблицу, и они будут имеют в колонке прогрессивное число (1,2 ..., 5), во второй «вставить в выбор» я добавляю еще 5 записей, и они должны иметь прогрессивную (6,7 ... 10)Прогрессивное число в "insert into select"

п.с. решение не должно быть тяжелым, я мог бы выбрать максимальный ток id и сделать разницу с максимальным id в начале сохраненного, но это слишком сильно замедлит мою процедуру.

+0

Добавьте столбец «Identity» в таблицу, в которую вы выбираете. – Siyual

+0

Сделайте этот столбец 'identity (1,1)' и он будет увеличиваться для каждой записи, вставленной в таблицу. –

ответ

6

Простейшим решением является для использования столбца identity в таблице, которую вы создаете. Однако это не гарантирует последовательности, но на практике это будет правильная идея.

Альтернативой является использование row_number() назначить последовательность:

insert into . . . 
    select @offset + row_number() over (order by (select NULL)), . . 
    . . .; 

Это дополнительные накладные расходы, потому что вы должны следить за @offset, так что значение является правильным. Этот метод является надежным в том смысле, что другой поток, добавляющий строки в таблицу, не будет влиять на ваши конкретные порядковые номера.

Мое предпочтение - первое решение. Если вам нужно получить порядковые номера без пробелов, вы можете использовать row_number() при запросе.

+0

Также обратите внимание, что второй вариант небезопасен - он может вызывать разбитые последовательности и дублировать идентификаторы. Если вы это сделаете, вам необходимо использовать сериализуемую изоляцию транзакций. – Luaan

+0

Но прогрессивное число должно начинаться с 1 за каждый раз, когда я начинаю свою процедуру, могу ли я сделать это с графом идентичности? В противном случае решение row_number() выглядит великолепно, только вопрос, есть ли простой способ получить последний row_number() после вставки в select? – thestral

+0

@ Софи. , , Столбец «identity» не запустится. Вы можете использовать предложение 'OUTPUT' для захвата данных, помещенных в таблицу. Тогда это простой запрос. –

Смежные вопросы