Tengo el requisito de crear un procedimiento almacenado que emule una secuencia TSQL. Es decir, siempre da un valor entero distinto y creciente en cada llamada. Además, si se pasa un entero, debe devolver ese valor si nunca ha habido un resultado mayor o el siguiente entero más alto disponible. No hace falta decir que puede haber varios clientes llamando a este SP al mismo tiempo.
Dada una tabla MetaInfo con columnas MetaKey varchar (max) y MeatValueLong bigInt. Se espera que la fila con la MetaKey de 'Internal-ID-Last' contenga el último valor más alto asignado. Creé el siguiente procedimiento almacenado:
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
Mi pregunta es simplemente: ¿funciona este procedimiento almacenado como se esperaba (a todas las personas que llamen se les asignará un resultado único)?