SQL Server 2012 Transact SQL új funkciók – Sequence

“Pár” új, régen várt funkcióval bővült a T-SQL nyelv az SQL Server 2012 verzióban. Mivel éppen aktuális a dolog, szeretnék párat bemutatni. Az első a Sequence azaz számsor, sorozat.

A legjobban az IDENTITY-hez lehet hasonlítani: amíg az IDENTITY egy tábla oszlopához rendlhető, addig a Sequence (számsor) több tábla több oszlopához rendelhető sorozatot tesz lehetővé.

Például:

Legyen két táblám, table1 és table2. Mindkét táblának legyen egy ID oszlopa int adattípussal, amit egy sorozatból szeretnék feltölteni. A sorozat kezdődjön egytől, majd kettesével növekedjen:

CREATE TABLE [dbo].[Table1]
(
	[ID] int NOT NULL,
	[Name] nvarchar(50) NULL
);

CREATE TABLE [dbo].[Table2]
(
	[ID] int NOT NULL,
	[Name] nvarchar(50) NULL
);
GO

Majd létrehozom a számsort:

CREATE SEQUENCE [dbo].[SampleSequence] AS int 
START WITH 1
INCREMENT BY 2;
GO

Ezek után hozzáadok sorokat (nem rekordokat Smilelsd: Joe Celko’s SQL for Smarties Advanced SQL Programming):

INSERT INTO [dbo].[Table1] ([ID], [Name]) VALUES (NEXT VALUE FOR [dbo].[SampleSequence], 'Test1');
INSERT INTO [dbo].[Table2] ([ID], [Name]) VALUES (NEXT VALUE FOR [dbo].[SampleSequence], 'Test2');

INSERT INTO [dbo].[Table1] ([ID], [Name]) VALUES (NEXT VALUE FOR [dbo].[SampleSequence], 'Test3');
INSERT INTO [dbo].[Table2] ([ID], [Name]) VALUES (NEXT VALUE FOR [dbo].[SampleSequence], 'Test4');

Majd az eredményt lekérdezem:

SELECT * FROM [dbo].[Table1];
SELECT * FROM [dbo].[Table2];

Ugye az elvárt eredmény a Sequence, számsor esetében az alábbi lesz:

Table1
ID Name
1 Test1
5 Test3

Table12
ID Name
3 Test2
7 Test4

 

Vannak további érdekes lehetőségek ezzel az újítással, amiket a BOL-ban, igen jó példákkal meg is lehet találni.

A teljes mintakód innen letölthető: sequence_sample.sql (1.13 kb)

Comments (4) -

Takács Béla 3/16/2014 10:01:36 AM

Ez nagyon klassz, de meg tudnád mondani, mi történik, ha az valamelyik insert hibát jelez egy tranzakcióban? Akkor megmarad a szekvencia objektum értékee, vagy növekszik?

Takács Béla 3/16/2014 10:02:22 AM

Ez nagyon klassz, de meg tudnád mondani, mi történik, ha az valamelyik insert hibát jelez egy tranzakcióban? Akkor megmarad a szekvencia objektum értékee, vagy növekszik?

Rollback esetén sajnos az érték kimarad a fenti példa alapján.

Pontosítok: ha a tranzakció során hiba történik és az visszavonásra kerül, abban az esetben a szekvencia értéke ugyanúgy növekszik. Pl.: a szekvencia értéke 4. A következő insert 5-öt szúrna be, de hiba történik eközben. A szekvencia aktuális értéke már 5, így a következő insert esetén már 6 lesz.
BEGIN TRAN
INSERT INTO [dbo].[Table1] ([ID], [Name]) VALUES (NEXT VALUE FOR [dbo].[SampleSequence], 'Test1'); --5
SELECT current_value FROM sys.sequences WHERE name = 'SampleSequence' --5
ROLLBACK

SELECT current_value FROM sys.sequences WHERE name = 'SampleSequence'--5
SELECT * FROM [dbo].[Table1];--nincs benne az 5, mert rollback

BEGIN TRAN
INSERT INTO [dbo].[Table1] ([ID], [Name]) VALUES (NEXT VALUE FOR [dbo].[SampleSequence], 'Test1'); --6
SELECT current_value FROM sys.sequences WHERE name = 'SampleSequence' --6
COMMIT
SELECT * FROM [dbo].[Table1];--6-os érték bent van

Add comment