У меня есть требование создать хранимую процедуру, которая эмулирует последовательность TSQL. То есть он всегда дает возрастающее целочисленное значение при каждом вызове. Кроме того, если передается целое число, оно должно возвращать это значение, если никогда не было результата, большего или следующего доступного целого числа. Само собой разумеется, что могут быть несколько клиентов, вызывающих этот SP одновременно.
Дана таблица MetaInfo со столбцами MetaKey varchar (max) и MeatValueLong bigInt. Ожидается, что строка с MetaKey 'Internal-ID-Last' будет содержать последнее присвоенное наибольшее значение. Я создал следующую хранимую процедуру:
CREATE PROCEDURE [dbo].[uspGetNextID]
(
@inID bigInt
)
AS
BEGIN
SET NOCOUNT ON;
BEGIN TRANSACTION
UPDATE MetaInfo WITH (ROWLOCK)
SET MetaValueLong = CASE
WHEN ISNULL(MetaValueLong,0) > @inID THEN MetaValueLong+1
ELSE @inID+1
END
WHERE MetaKey = 'Internal-ID-Last'
SELECT MetaValueLong
FROM MetaInfo
WHERE MetaKey = 'Internal-ID-Last'
COMMIT TRANSACTION
END
У меня простой вопрос, работает ли эта хранимая процедура как ожидалось (всем абонентам будет присвоен уникальный результат)?