MS SQL Server ja sequence’id

30.07.2006  |  Gunnar

MS 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.

CREATE PROCEDURE dbo.GetNextSeq
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.

CREATE PROCEDURE dbo.GetNextSeq
@SeqVal INT OUTPUT
AS

BEGIN TRANSACTION
INSERT INTO SEQ (SeqTmp) VALUES(NULL)
ROLLBACK

SET @SeqVal = @@IDENTITY

Kommenteeri

sulge
Saada link e-postiga

© DT 2012 | Creative Commons Attribution-Noncommercial 3.0 License | WordPress