Ho un requisito per creare una procedura memorizzata che emula una sequenza TSQL. Cioè dà sempre un valore intero distinto crescente su ogni chiamata. Inoltre, se viene passato un numero intero, dovrebbe restituire quel valore se non è mai stato ottenuto un risultato maggiore o il successivo intero più alto disponibile. Inutile dire che possono esserci più client che chiamano questo SP contemporaneamente.
Data una tabella MetaInfo con colonne MetaKey varchar (max) e MeatValueLong bigInt. Si prevede che la riga con il MetaKey di "Internal-ID-Last" conterrà l'ultimo valore più alto assegnato. Ho creato la seguente procedura memorizzata:
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
La mia domanda è semplicemente: questa procedura memorizzata funziona come previsto (a tutti i chiamanti verrà assegnato un risultato unico)?