Eu tenho um requisito para criar um procedimento armazenado que emula uma sequência TSQL. Ou seja, sempre fornece um valor inteiro distinto crescente em cada chamada. Além disso, se um número inteiro for passado, ele retornará esse valor se nunca houve um resultado maior ou o próximo número inteiro mais alto disponível. Escusado será dizer que pode haver vários clientes chamando este SP ao mesmo tempo.
Dada uma tabela MetaInfo com as colunas MetaKey varchar (max) e MeatValueLong bigInt. Espera-se que a linha com a MetaKey de 'Internal-ID-Last' contenha o último valor mais alto atribuído. Eu criei o seguinte procedimento armazenado:
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
Minha pergunta é simplesmente: esse procedimento armazenado funciona como esperado (todos os chamadores receberão um resultado exclusivo)?