Ich muss eine gespeicherte Prozedur erstellen, die eine TSQL-Sequenz emuliert. Das heißt, es wird bei jedem Aufruf immer ein ansteigender eindeutiger ganzzahliger Wert angegeben. Wenn eine Ganzzahl übergeben wird, sollte dieser Wert außerdem zurückgegeben werden, wenn noch nie ein Ergebnis größer oder die nächsthöhere verfügbare Ganzzahl vorlag. Es versteht sich von selbst, dass es mehrere Clients geben kann, die diesen SP gleichzeitig aufrufen.
Gegeben eine Tabelle MetaInfo mit den Spalten MetaKey varchar (max) und MeatValueLong bigInt. Es wird erwartet, dass die Zeile mit dem MetaKey 'Internal-ID-Last' den zuletzt zugewiesenen höchsten Wert enthält. Ich habe die folgende gespeicherte Prozedur erstellt:
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
Meine Frage ist einfach, funktioniert diese gespeicherte Prozedur wie erwartet (allen Anrufern wird ein eindeutiges Ergebnis zugewiesen)?