MS SQL Server ja sequence’id
30.07.2006 | GunnarMS SQL Server ei tunne selliseid andmebaasiobjekte nagu seda on sequence'id. Sequence'ite toe loomiseks on mitmeid võimalusi. Esitan siinkohal neist sellise, millel on kõrvalefektid pea olematud.
Idee iseenesest on lihtne. Loome ühe kahe väljaga tabeli, mille üheks veeruks on automaatselt suureneva väärtusega id veerg ning teiseks veeruks on suvalist tüüpi veerg, millele on lubatud sisestada väärtust NULL. Olgu nende veergude nimed SeqVal ja SeqTmp. SeqTmp tüübiks võib vabalt olla näiteks bit. Järgmiseks loome protseduuri, mis tagastab meile igal pöördumisel uue SeqVal veeru väärtuse, mis on eelmisest ühe võrra suurem.
Kogu lahenduse konks peitub selles, et automaatselt väärtusi saav SeqVal veerg saab alati uue väärtuse kui tabelisse andmeid sisestatakse. Väärtust suurendatakse ka siis, kui sisestus tehti mõne rollbackiga lõppenud transactioni raames. Rollback ei tühista SeqVal veeru käesoleva väärtuse suurendamist. See tähendab seda, et peale rollbacki jääb kehtima loenduri see väärtus, mis sisestamise ajal tekkis.
AS
BEGIN TRANSACTION
INSERT INTO SEQ (SeqTmp) VALUES(NULL)
ROLLBACK
RETURN @@IDENTITY
Juhul, kui on soov saada sequence'i uus väärtus kätte väljundparameetrist, tuleb kasutada alltoodud versiooni protseduurist.
@SeqVal INT OUTPUT
AS
BEGIN TRANSACTION
INSERT INTO SEQ (SeqTmp) VALUES(NULL)
ROLLBACK
SET @SeqVal = @@IDENTITY
