Я сделал это в прошлом году на проекте. По сути, я только что создал таблицу с именем последовательности, текущего значения и суммы приращения.
Тогда я создал 4 проца:
- GetCurrentSequence (sequenceName)
- GetNextSequence (sequenceName)
- CreateSequence (sequenceName, startValue, incrementAmount)
- DeleteSequence (sequenceName)
Но есть ограничение, которое вы можете не оценить; Функции не могут иметь побочных эффектов. Таким образом, вы можете создать функцию для GetCurrentSequence (...), но GetNextSequence (...) должен быть процедурой, так как вы, вероятно, захотите увеличить текущее значение последовательности. Однако, если это процесс, вы не сможете использовать его непосредственно в своих операторах вставки.
Так что вместо
insert into mytable(id, ....) values( GetNextSequence('MySequence'), ....);
Вместо этого вам нужно разбить его на 2 строки;
declare @newID int;
exec @newID = GetNextSequence 'MySequence';
insert into mytable(id, ....) values(@newID, ....);
Кроме того, в SQL Server нет механизма, который может делать что-то вроде
MySequence.Current
или
MySequence.Next
Надеюсь, кто-нибудь скажет мне, что я ошибаюсь с вышеуказанными ограничениями, но я почти уверен, что они точны.
Удачи.