Sorszámok

A következőkre vonatkozik:SQL ServerAzure SQL DatabaseFelügyelt Azure SQL-példánySQL-adatbázis a Microsoft Fabricben

Ez a cikk bemutatja, hogyan használhat sorszámokat az SQL Serverben, az Azure SQL Database-ben és a felügyelt Azure SQL-példányban. A sorozat egy felhasználó által definiált sémaalapú objektum, amely numerikus értékek sorozatát hozza létre annak a specifikációnak megfelelően, amellyel a sorozat létre lett hozva.

Áttekintés

A numerikus értékek sorozata növekvő vagy csökkenő sorrendben, meghatározott időközönként jön létre, és igény szerint ciklust (ismétlést) is eredményezhet. Az identitásoszlopokkal ellentétben a sorozatok nincsenek táblákhoz társítva. Az alkalmazások egy sorozatobjektumra hivatkoznak a következő érték fogadásához. A sorozatok és táblák közötti kapcsolatot az alkalmazás szabályozza. A felhasználói alkalmazások hivatkozhatnak egy szekvenciaobjektumra, és koordinálhatják az értékkulcsokat több sorban és táblában.

Az utasítás használatával a rendszer a tábláktól függetlenül hoz létre egy sorozatot CREATE SEQUENCE . A beállítások segítségével szabályozhatja a növekményt, a maximális és minimális értékeket, a kezdőpontot, az automatikus újraindítási képességet és a gyorsítótárazást a teljesítmény javítása érdekében. A beállításokkal kapcsolatos információkért lásd: CREATE SEQUENCE.

A sorok beszúrásakor létrehozott identitásoszlopértékekkel ellentétben az alkalmazás a sor beszúrása előtt lekérheti a következő sorszámot a NEXT VALUE FOR függvény meghívásával. A sorszámot akkor is kiosztja a rendszer, amikor NEXT VALUE FOR meghívásra kerül, még akkor is, ha a szám soha nem lesz beszúrva egy táblába. A NEXT VALUE FOR függvény a tábladefiníció oszlopainak alapértelmezett értékeként használható. A sp_sequence_get_range használatával egyszerre több sorszámtartományt is lekérhet.

A sorozatok bármely egész szám adattípusként definiálhatók. Ha az adattípus nincs megadva, a sorozat alapértelmezés szerint bigint lesz.

Sorozatok használata

Az alábbi forgatókönyvekben identitásoszlopok helyett szekvenciákat használjon:

  • Az alkalmazásnak szüksége van egy számra, mielőtt beszúrja a táblázatba.

  • Az alkalmazásnak egyetlen számsort kell megosztania több tábla vagy egy tábla több oszlopa között.

  • Az alkalmazásnak újra kell indítania a számsort egy megadott szám elérésekor. Például az 1 és 10 értékek hozzárendelése után az alkalmazás újra elkezdi az 1 és 10 értékek hozzárendelését.

  • Az alkalmazás megköveteli, hogy a szekvenciaértékeket egy másik mező szerint rendezze. A NEXT VALUE FOR függvény alkalmazhatja a záradékot OVER a függvényhívásra. A OVER záradék garantálja, hogy a visszaadott értékek a OVER záradék ORDER BY záradékának sorrendjében jönnek létre.

  • Egy alkalmazáshoz egyszerre több számot kell hozzárendelni. Egy alkalmazásnak például öt egymást követő számot kell lefoglalnia. Ha identitásértékeket kér le, akkor az adatsorban rések keletkezhetnek, ha más folyamatok egyidejűleg számokat adnak ki. A sp_sequence_get_range hívása egyszerre több számot is lekérdezhet a sorozatból.

  • Módosítania kell a sorozat specifikációját, például a növekmény értékét.

Korlátozások

Az identitásoszlopokkal ellentétben, amelyek értékei nem módosíthatók, a rendszer nem védi automatikusan a sorozatértékeket a táblázatba való beszúrás után. A sorrendértékek módosításának megakadályozása érdekében használja a tábla frissítési eseményindítót a módosítások visszaállításához.

Az egyediség nem lesz automatikusan kényszerítve a szekvenciaértékek esetében. A szekvenciaértékek újrafelhasználásának lehetősége szándékos tervezési elem. Ha egy táblában egyedi sorrendértékekre van szükség, hozzon létre egy egyedi kényszert az oszlopon. Ha egy táblacsoportban a sorszámértékeknek egyedinek kell lenniük, hozzon létre eseményindítókat az ismétlődések megakadályozására, amelyeket a frissítési utasítások vagy a sorszámok újraindulása okozhat.

A szekvenciaobjektum a definíciója szerint generál számokat, de a sorrendobjektum nem szabályozza a számok használatát. A táblázatba beszúrt sorszámok hézagokkal rendelkezhetnek egy tranzakció visszagördülésekor, ha egy sorozatobjektumot több tábla oszt meg, vagy ha a sorszámok a táblákban való használat nélkül vannak lefoglalva. Ha ezzel a CACHE beállítással jön létre, egy váratlan leállítás( például áramkimaradás) elveszítheti a gyorsítótárban lévő sorszámokat.

Ha a függvénynek több példánya is ugyanazt a NEXT VALUE FOR sorozatgenerátort adja meg egyetlen Transact-SQL utasításban, az összes példány ugyanazt az értéket adja vissza egy adott sorhoz, amelyet az adott Transact-SQL utasítás feldolgoz. Ez a viselkedés összhangban van az ANSI szabványsal.

A sorszámok az aktuális tranzakció hatókörén kívül jönnek létre. Ezek akkor is felhasználódnak, függetlenül attól, hogy a sorszámot használó tranzakciót véglegesítik vagy visszagörgetik. Az ismétlődő ellenőrzés csak akkor történik meg, ha egy rekord teljesen fel van töltve. Ez olyan eseteket eredményezhet, amikor ugyanazt a számot több rekordhoz használják a létrehozás során, de a rendszer ismétlődőként azonosítja. Ha ez bekövetkezik, és más számlálóértékeket alkalmaz a rendszer a későbbi rekordokra, az eltérést eredményezhet a számlálóértékek között.

Tipikus használat

A -2 147 483 648-tól 2 147 483 647-ig terjedő és 1-gyel növekvő egész számsor létrehozásához használja az alábbi utasítást.

CREATE SEQUENCE Schema.SequenceName
    AS INT
    INCREMENT BY 1;

Ha egy identitásoszlophoz hasonló egész számsorozatot szeretne létrehozni, amely 1-ről 2 147 483 647-re nő, használja az alábbi utasítást.

CREATE SEQUENCE Schema.SequenceName
    AS INT
    START WITH 1
    INCREMENT BY 1;

Sorozatok kezelése

A sorozatokkal kapcsolatos információért futtassa a lekérdezést: sys.sequences .

Példák

További példákat is talál a cikkekben CREATE SEQUENCE, a NEXT VALUE FOR és a sp_sequence_get_range.

Egy. Sorszám használata egyetlen táblában

Az alábbi példa létrehoz egy Teszt nevű sémát, egy Rendelések nevű táblát és egy sorrendet CountBy1, majd sorokat szúr be a táblába a NEXT VALUE FOR függvény használatával.

CREATE SCHEMA Test;
GO

CREATE TABLE Test.Orders
(
    OrderID INT PRIMARY KEY,
    Name VARCHAR (20) NOT NULL,
    Qty INT NOT NULL
);
GO

CREATE SEQUENCE Test.CountBy1
    START WITH 1
    INCREMENT BY 1;
GO

INSERT Test.Orders (OrderID, Name, Qty)
VALUES (NEXT VALUE FOR Test.CountBy1, 'Tire', 2);

INSERT test.Orders (OrderID, Name, Qty)
VALUES (NEXT VALUE FOR Test.CountBy1, 'Seat', 1);

INSERT test.Orders (OrderID, Name, Qty)
VALUES (NEXT VALUE FOR Test.CountBy1, 'Brake', 1);

SELECT *
FROM Test.Orders;

Itt vannak az eredmények.

OrderID  Name   Qty
-------- ------ ---
1        Tire    2
2        Seat    1
3        Brake   1

B. Sor beszúrása előtt hívja meg a következő értéket

Orders Az A példában létrehozott táblázat használatával az alábbi példa deklarál egy változót, @nextIDmajd a NEXT VALUE FOR függvény használatával beállítja a változót a következő elérhető sorszámra. Az alkalmazás feltehetően feldolgozta a megrendelést, például megadja az ügyfélnek a lehetséges rendelések OrderID számát, majd ellenőrzi a megrendelést. Függetlenül attól, hogy mennyi ideig tart ez a feldolgozás, vagy hány további rendelést ad hozzá a folyamat során, az eredeti szám megmarad a kapcsolat általi használatra. Végül a INSERT utasítás hozzáadja a rendelést a Orders táblához.

DECLARE @NextID AS INT;
SET @NextID = NEXT VALUE FOR Test.CountBy1;

INSERT Test.Orders (OrderID, Name, Qty)
VALUES (@NextID, 'Rim', 2);

C. Sorszám használata több táblában

Ez a példa feltételezi, hogy egy gyártósori monitorozási folyamat értesítést kap a műhelyben bekövetkező eseményekről. Minden esemény egyedi és monoton módon növekvő EventID számot kap. Minden esemény ugyanazt a EventID sorszámot használja, így az összes eseményt összevonó jelentések egyedileg azonosíthatják az egyes eseményeket. Az eseményadatokat azonban az esemény típusától függően három különböző táblában tárolja a rendszer. A példakód egy Auditnevű sémát, egy EventCounternevű sorozatot és három táblát hoz létre, amelyek mindegyike a EventCounter sorozatot használja alapértelmezett értékként. Ezután a példa sorokat ad hozzá a három táblához, és lekérdezi az eredményeket.

CREATE SCHEMA Audit;
GO

CREATE SEQUENCE Audit.EventCounter
    AS INT
    START WITH 1
    INCREMENT BY 1;
GO

CREATE TABLE Audit.ProcessEvents
(
    EventID INT DEFAULT ( NEXT VALUE FOR Audit.EventCounter) PRIMARY KEY CLUSTERED,
    EventTime DATETIME DEFAULT (getdate()) NOT NULL,
    EventCode NVARCHAR (5) NOT NULL,
    Description NVARCHAR (300) NULL
);
GO

CREATE TABLE Audit.ErrorEvents
(
    EventID INT DEFAULT ( NEXT VALUE FOR Audit.EventCounter) PRIMARY KEY CLUSTERED,
    EventTime DATETIME DEFAULT (getdate()) NOT NULL,
    EquipmentID INT NULL,
    ErrorNumber INT NOT NULL,
    EventDesc NVARCHAR (256) NULL
);
GO

CREATE TABLE Audit.StartStopEvents
(
    EventID INT DEFAULT ( NEXT VALUE FOR Audit.EventCounter) PRIMARY KEY CLUSTERED,
    EventTime DATETIME DEFAULT (getdate()) NOT NULL,
    EquipmentID INT NOT NULL,
    StartOrStop BIT NOT NULL
);
GO

INSERT Audit.StartStopEvents (EquipmentID, StartOrStop)
VALUES (248, 0);

INSERT Audit.StartStopEvents (EquipmentID, StartOrStop)
VALUES (72, 0);

INSERT Audit.ProcessEvents (EventCode, Description)
VALUES (2735, 'Clean room temperature 18 degrees C.');

INSERT Audit.ProcessEvents (EventCode, Description)
VALUES (18, 'Spin rate threshold exceeded.');

INSERT Audit.ErrorEvents (EquipmentID, ErrorNumber, EventDesc)
VALUES (248, 82, 'Feeder jam');

INSERT Audit.StartStopEvents (EquipmentID, StartOrStop)
VALUES (248, 1);

INSERT Audit.ProcessEvents (EventCode, Description)
VALUES (1841, 'Central feed in bypass mode.');

SELECT EventID,
       EventTime,
       Description
FROM Audit.ProcessEvents
UNION
SELECT EventID,
       EventTime,
       EventDesc
FROM Audit.ErrorEvents
UNION
SELECT EventID,
       EventTime,
       CASE StartOrStop WHEN 0 THEN 'Start' ELSE 'Stop' END
FROM Audit.StartStopEvents
ORDER BY EventID;

Itt vannak az eredmények.

EventID     EventTime               Description
----------- ----------------------- ------------------------------------
1           2025-12-09 17:41:57.350 Start
2           2025-12-09 17:41:57.350 Start
3           2025-12-09 17:41:57.350 Clean room temperature 18 degrees C.
4           2025-12-09 17:41:57.350 Spin rate threshold exceeded.
5           2025-12-09 17:41:57.350 Feeder jam
6           2025-12-09 17:41:57.350 Stop
7           2025-12-09 17:41:57.350 Central feed in bypass mode.

D. Ismétlődő sorszámok létrehozása eredményhalmazban

Az alábbi példa a sorszámok két funkcióját szemlélteti: a kerékpározást és a NEXT VALUE FOR kijelölési utasításban való használatát.

CREATE SEQUENCE CountBy5
    AS TINYINT
    START WITH 1
    INCREMENT BY 1
    MINVALUE 1
    MAXVALUE 5
    CYCLE;
GO

SELECT NEXT VALUE FOR CountBy5 AS SurveyGroup,
       Name
FROM sys.objects;

E. Sorszámok létrehozása egy eredményhalmazhoz az OVER záradék használatával

Az alábbi példa a OVER záradékkal rendezi az eredményhalmazt Name szerint, mielőtt hozzáadja a sorszámoszlopot.

USE AdventureWorks2022;
GO

CREATE SCHEMA Samples;
GO

CREATE SEQUENCE Samples.IDLabel
    AS TINYINT
    START WITH 1
    INCREMENT BY 1;
GO

SELECT NEXT VALUE FOR Samples.IDLabel OVER (ORDER BY Name) AS NutID,
       ProductID,
       Name,
       ProductNumber
FROM Production.Product
WHERE Name LIKE '%nut%';

F. A sorszám alaphelyzetbe állítása

Az E példa a Samples.IDLabel sorszámainak első 79-ét használta fel. (Előfordulhat, hogy a AdventureWorks2025 verziója eltérő számú eredményt ad vissza.) Hajtson végre a következő műveletet a következő 79 sorszám felhasználásához (80-tól 158-ig).

SELECT NEXT VALUE FOR Samples.IDLabel OVER (ORDER BY Name) AS NutID,
       ProductID,
       Name,
       ProductNumber
FROM Production.Product
WHERE Name LIKE '%nut%';

Hajtsa végre a következő utasítást a Samples.IDLabel sorozat újraindításához.

ALTER SEQUENCE Samples.IDLabel
    RESTART WITH 1;

A select utasítás ismételt végrehajtásával ellenőrizze, hogy a Samples.IDLabel sorozat újraindult-e az 1-es számmal.

SELECT NEXT VALUE FOR Samples.IDLabel OVER (ORDER BY Name) AS NutID,
       ProductID,
       Name,
       ProductNumber
FROM Production.Product
WHERE Name LIKE '%nut%';

G. Tábla módosítása identitásról szekvenciára

Az alábbi példa létrehoz egy sémát és egy táblát, amely három sort tartalmaz a példához. Ezután a példa hozzáad egy új oszlopot, és elveti a régi oszlopot.

CREATE SCHEMA Test;
GO

CREATE TABLE Test.Department
(
    DepartmentID SMALLINT IDENTITY (1, 1) NOT NULL,
    Name NVARCHAR (100) NOT NULL,
    GroupName NVARCHAR (100) NOT NULL CONSTRAINT PK_Department_DepartmentID PRIMARY KEY CLUSTERED (DepartmentID ASC)
);
GO

INSERT Test.Department (Name, GroupName)
VALUES ('Engineering', 'Research and Development');
GO

INSERT Test.Department (Name, GroupName)
VALUES ('Tool Design', 'Research and Development');
GO

INSERT Test.Department (Name, GroupName)
VALUES ('Sales', 'Sales and Marketing');
GO

SELECT *
FROM Test.Department;
GO

ALTER TABLE Test.Department
    ADD DepartmentIDNew SMALLINT NULL;
GO

UPDATE Test.Department
    SET DepartmentIDNew = DepartmentID;
GO

ALTER TABLE Test.Department DROP CONSTRAINT [PK_Department_DepartmentID];
ALTER TABLE Test.Department DROP COLUMN DepartmentID;
GO

EXECUTE sp_rename 'Test.Department.DepartmentIDNew', 'DepartmentID', 'COLUMN';
GO

ALTER TABLE Test.Department ALTER COLUMN DepartmentID SMALLINT NOT NULL;

ALTER TABLE Test.Department
    ADD CONSTRAINT PK_Department_DepartmentID PRIMARY KEY CLUSTERED (DepartmentID ASC);

SELECT MAX(DepartmentID)
FROM Test.Department;

CREATE SEQUENCE Test.DeptSeq
    AS SMALLINT
    START WITH 4
    INCREMENT BY 1;
GO

ALTER TABLE Test.Department
    ADD CONSTRAINT DefSequence DEFAULT ( NEXT VALUE FOR Test.DeptSeq) FOR DepartmentID;
GO

SELECT DepartmentID,
       Name,
       GroupName
FROM Test.Department;

INSERT Test.Department (Name, GroupName)
VALUES ('Audit', 'Quality Assurance');
GO

SELECT DepartmentID,
       Name,
       GroupName
FROM Test.Department;

A Transact-SQL utasítások, amelyek SELECT * használatával az új oszlopot az első oszlop helyett az utolsó oszlopként látják. Ha ez nem elfogadható, akkor létre kell hoznia egy teljesen új táblát, át kell helyeznie az adatokat, majd újra létre kell hoznia az engedélyeket az új táblán.