Сценарий: у меня есть довольно общая таблица (Данные), в которой есть столбец идентификаторов. Данные в этой таблице сгруппированы (скажем, по городам).
Пользователям нужен идентификатор для печати на бумажных бланках и т. Д.
Пользователи могут получить доступ только к данным своих сайтов, поэтому, если они используют столбец идентификаторов для этой цели, они увидят нечетные числа (например, пользователь «Нью-Йорк» может увидеть 1,37,2028 ... в качестве перечисленных ключей.
В идеале они увидят 1,2,3 ... (или что-то подобное)
Проблема, конечно же, заключается в параллелизме. Это веб-приложение, которое вы не можете просто получить:
UserId = Выбрать количество (*) + 1 из данных, где город = 'Нью-Йорк'
Кто-нибудь придумал какие-нибудь хитрые пути решения этой проблемы?
Обновлено - из комментариев ниже я думаю, что хочу что-то вроде SP ниже. Не совсем уверен, как рекурсия должна работать в блоке CATCH.
ALTER PROCEDURE [dbo].[DataContainer_Insert]
@SomeData varchar(max),
@DataContainerId int out
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
BEGIN TRY
SELECT @UserId = MAX(UserId) From DataContainer
INSERT INTO DataContainer (UserId, SomeData)
VALUES (@UserId, SomeData)
SELECT @DataContainerId = scope_identity()
END TRY
BEGIN CATCH
--try again
exec DataContainer_Insert @DataContainerId, @SomeData
END CATCH
END