Sequence in MS SQL Server 2012

Microsoft SQL Server 2012 je pored ostalog doneo i SEQUENCE objekat koji oni koji su se bavili Oracle-om već poznaju. SEQUENCE objekat se najčešće koristi za dobijanje vrednosti  za surogat key u tabelama tj. najčešće se koristi na isti način kao što se koristi IDENTITY.

Da odmah rasčistimo, SEQUENCE nije isto što i IDENTITY i nije zamena za IDENTITY. IDENTITY je property konkretne kolone na konkretnoj tabeli a SEQUENCE je objekat. SEQUENCE je dodat zbog nekih osobina koje nema IDENTITY a koje su ipak bile potrebne. Koje su to osobine? Prvo, SEQUENCE je zaseban objekat i nije  vezan za konkretnu tabelu i jedan SEQUENCE objekat moguće je koristiti na više tabela paralelno. Drugo, SEQUENCE je moguće alterovati. Zatim na SEQUENCE objektu je moguće definisati rang itd…

Već  samo to što se isti SEQUENCE objekat može koristiti na dve tabele kao primarni ključ je meni bilo dovoljno. Da podsetim da se IDENTITY najčešće koristi kao primarni ključ na tabelama. Problem je bio u tome što se takav primarni ključ nije mogao koristiti u PARTICIONISANIM VIEW-ovima kojima su perfomanse mogle biti izuzetno poboljšane. Ali, hajdemo po redu.

Sintaksa za SEQUENCE je:

CREATE SEQUENCE [schema_name . ] sequence_name
[ AS [ built_in_integer_type | user-defined_integer_type ] ]
[ START WITH <constant> ]
[ INCREMENT BY <constant> ]
[ { MINVALUE [ <constant> ] } | { NO MINVALUE } ]
[ { MAXVALUE [ <constant> ] } | { NO MAXVALUE } ]
[ CYCLE | { NO CYCLE } ]
[ { CACHE [ <constant> ] } | { NO CACHE } ]
[ ; ]

Detalji sintakse mogu se videti na MSDN-u.

Kod za kreiranja jednog SEQUENCE objekta dat je u primeru 1.

USE Test;
CREATE SEQUENCE dbo.seq_Test AS INT
START WITH 1
INCREMENT BY 1;

Primer 1. Kreiranje SEQUENCE objekta

Novi SEQUENCE objekat se može videti i u Microsoft SQL Server Management Studi-u (slika 1).

Slika 1. Kreirani SEQUENCE objekat u Microsoft SQL Server Management Studi-u

Ako se desnim tasterom miša klikne na folder “Sequences” u Microsoft SQL Server Management Studi-u  ili na neki  već postojeći SEQUENCE objekat dobiće se popup meni sa opcijama za kreiranje i održavanje SEQUENCE objekata (slika 2).

Slika 2. Popup meni za kreiranje i održavanje SEQUENCE objekata

Da bi se dobile vrednosti od SEQUENCE objekta koji smo kreirali u primeru 1 može se koristiti NEXT VALUE FOR kao što je dato u primeru 2.

SELECT NEXT VALUE FOR dbo.seq_Test;
SELECT NEXT VALUE FOR dbo.seq_Test;

Primer 2. Korišćenje SEQUENCE objekta za dobijanje vrednosti

Rezultat izvršenja TSQL koda iz primera 2 je dat na slici 3.

Slika 3. Rezultat pozivanja SEQUENCE objekta iz primera 2

Pošto sam već pomenuo korišćenje istog SEQUENCE objekta na dve tabele, u primeru 3 dat je TSQL kod za kreiranje dve tabele i insert podataka u njih korišćenjem SEQUENCE objekta.

CREATE TABLE dbo.Tabela1 (   Seq_ID INT NOT NULL, ImeIPrezime NVARCHAR(50) NOT NULL );

CREATE TABLE dbo.Tabela2 (   Seq_ID INT NOT NULL, ImeIPrezime NVARCHAR(50) NOT NULL );

INSERT INTO dbo.Tabela1(Seq_ID, ImeIPrezime) VALUES(NEXT VALUE FOR dbo.seq_Test, N'Petar Petrović');

INSERT INTO dbo.Tabela2(Seq_ID, ImeIPrezime) VALUES(NEXT VALUE FOR dbo.seq_Test, N'Ivan Ivanović');

SELECT * FROM Tabela1

SELECT * FROM Tabela2

Primer 3. Korišćenje istog SEQUENCE objekta u dve tabele

Rezultat SELECT izraza na kraju koda u primeru 3 vraća rezultat koji je prikazan na slici 4.

Slika 4. Rezultat korišćenja istog SEQUENCE objekta u dve tabele

Postojeći SEQUENCE objekat je vrlo lako restartovati ako se za tim javi potreba. TSQL kod restarta SEQUENCE objekta dat je u primeru 4.

ALTER SEQUENCE seq_Test RESTART WITH 1

Primer 4. Restartovanje SEQUENCE objekta

SEQUENCE objekat je moguće kreirati sa rangom vrednosti koje može da generiše konkretni SEQUENCE. TSQL kod za kreiranje SEQUENCE objekta sa rangom je dat u primeru 5.

CREATE SEQUENCE seqRang_Test AS int
START WITH 1
INCREMENT BY 1
MINVALUE 1
MAXVALUE 100

Primer 5. Kreiranje SEQUENCE objekta sa definisanim rangom

Korišćenjem funkcije sp_sequence_get_range dobja se rang vrednosti od konkretnog SEQUENCE objekta (primer 6).

DECLARE @prva_vrednost sql_variant ,@poslednja_vrednost sql_variant

EXEC sp_sequence_get_range

@sequence_name = N'seqRang_Test' ,

@range_size = 10 ,

@range_first_value = @prva_vrednost OUTPUT ,

@range_last_value = @poslednja_vrednost OUTPUT;

SELECT @prva_vrednost AS PrviBroj,

@poslednja_vrednost as PoslednjiBroj

Primer 6. Dobijanje ranga vrednosti od SEQUENCE objekta

Rezultat izvršavanja koda koji je dat u primeru 1 je dat na slici 5.

Slika 5. Rezultat iszvršavanja TSQL koda iz primera 5.

Kad se konkretan SEQUENCE objekat prozove dovoljan broj puta da se premaši maksimalna vrednost koja je definisana kod kreiranja SEQUENCE objekta onda će se javiti greška kao na slici 6.

Slika 6. Greška koja se javlja kad konkretan SEQUENCE objekat premaši definisanu maksimalnu vrednost

Na kraju, osobine konkretnog SEQUENCE objekta se mogu proveriti korišćenjem sistemskog view-a kao što je dato u primeru 6.

SELECT * FROM sys.sequences WHERE name = 'seq_Test';

Primer 6. TSQL kod za dobijanje osobina konkretnog SEQUENCE objekta.

Do osobina konkretnog SEQUENCE objekta može se doći i kroz Microsoft SQL Management Studio kroz opciju “Properties” iz popup menija konkretnog SEQUENCE objekta (desni taster miša na konkretni SEQUENCE objekat). Kroz formu koja je data na slici 7 mogu se i menjati osobine konkretnog SEQUENCE objekta.

Slika 7. Properties forma SEQUENCE objekta

Leave a Reply

%d bloggers like this: