Я хотел бы иметь функцию SQL Server dbo.GetNextNumber()
, которая генерировала бы последовательные номера для каждого вызова.Насколько я понимаю, это невозможно с нативной функцией T-SQL, поскольку SQL Server настаивает, что функции должны быть детерминированными.Но, если бы вы могли показать мне встроенную функцию T-SQL, которая делает это, я действительно смогу это сделать.
Я подумал, что, возможно, это можно написать с помощью функции CLR.Так как функции CLR являются статическими, порядковые номера должны храниться в контексте вызова операции set, так как сохранение ее в качестве статической переменной приведет к тому, что несколько соединений будут использовать одну и ту же последовательность, что приведет к не очень последовательным числам.Я недостаточно знаю о встроенном CLR, чтобы увидеть, доступен ли контекст вызова операции set (select, update, delete, insert) со стороны CLR.
В конце дня следующий запрос
select dbo.GetNextNumber() from sysobjects
должен возвращать результат
1
2
3
4
5
Это нормально, если необходим другой вызов функции для сброса контекста, например
exec dbo.ResetSequenceNumbers()
Чтобы предотвратить некоторые недоразумения и уменьшить шансытратить ваше время на ответ на неправильный вопрос, обратите внимание, что я не ищу функцию генерации идентификатора для таблицы, и мне известны некоторые хаки (хотя и с использованием proc, а не функции), которые включают некоторые временные таблицы со столбцами идентификаторов.Функция ROW_NUMBER()
близка, но также не обрезается.
Большое спасибо за любые ответы
Kemal
PS Удивительно, что SQL Server действительно имеет встроеннуюв функции для этого.Функция (при условии, что ее нельзя использовать в объединениях и выражениях), действительно проста и чрезвычайно полезна, но по какой-то причине она не включена.