У меня есть SQL-скрипт, который вставляет данные (с помощью операторов INSERT, в настоящее время насчитывающих тысячи). Один из столбцов содержит уникальный идентификатор (хотя не тип IDENTITY, а просто обычный объект int), который фактически уникален для нескольких разных столы.
Я хотел бы добавить скалярную функцию в мой скрипт, которая получает следующий доступный идентификатор (то есть последний использованный идентификатор + 1), но я не уверен, что это возможно, потому что, кажется, нет способа использовать глобальная или статическая переменная из UDF, я не могу использовать временную таблицу и не могу обновить постоянную таблицу из функции.
В настоящее время мой скрипт выглядит так:
declare @v_baseID int
exec dbo.getNextID @v_baseID out --sproc to get the next available id
--Lots of these - where n is a hardcoded value
insert into tableOfStuff (someStuff, uniqueID) values ('stuff', @v_baseID + n )
exec dbo.UpdateNextID @v_baseID + lastUsedn --sproc to update the last used id
Но мне бы хотелось, чтобы это выглядело так:
--Lots of these
insert into tableOfStuff (someStuff, uniqueID) values ('stuff', getNextID() )
Жесткое кодирование смещения - это боль в заднице, и оно подвержено ошибкам. Упаковка в простую скалярную функцию очень привлекательна, но я начинаю думать, что это невозможно, так как, похоже, нет способа поддерживать счетчик смещения между вызовами. Это правда, или я что-то упустил?
В настоящее время мы используем SQL Server 2005.
правки для уточнения:
Два пользователя попадут в него не произойдет. Это скрипт обновления, который будет запущен только один раз и никогда не будет одновременно.
Реальный sproc не имеет префикса sp_, исправил пример кода.
При обычном использовании мы используем таблицу идентификаторов и sproc для получения идентификаторов по мере необходимости, я просто искал более чистый способ сделать это в этом сценарии, который по сути просто сбрасывает кучу данных в базу данных.