En nybörjarguide till sekvensobjekt i SQL Server

SQL Server har stöds SEQUENCE-objekt sedan starten av SQL Server 2012 och senare utgåvor. Oracle-databasen har stödit SEQUENCE-objekt från början. Du kan läsa arkivposten på Tech-Recipes med hjälp av SEQUENCE i Oracle.

Vi kan skapa en SEQUENCE i SQL Server för att generera sekventiella numeriska värden enligt de angivna riktlinjerna. SEQUENCE-objekt kan klassificeras med en IDENTITY-kolumn i SQL Server, men i motsats till IDENTITY-kolumner är inte SEKQUENCE-objekt kopplade till tabellobjekt. IDENTITET anses vara en tabellegenskap som är kopplad till tabeller, medan SEQUENCE-objekt skapas oberoende och kan användas med DML-satser som INSERT och UPDATE eller för att hänvisa ett SEKQUENCE-objekt separat. Denna handledning är en nybörjarguide till SEQUENCE-objekt i SQL Server.

Hur man skiljer mellan SEKVENS OCH IDENTITETS Egenskaper

1. Sekvensobjekt är inte beroende av tabeller, medan identitetsegenskaper är associerade med tabeller.

2. Sekvensobjekt används för att generera sekventiella värden över flera tabeller med databasens räckvidd. Egenskapen Identity kan användas för att generera inkrementella tal vid bordsnivån.

3. Sekvensobjekt introducerades med en upplaga av SQL Server 2012, medan Identity-egenskaper stöds med äldre versioner av SQL Server.

4. Vi kan återställa ett sekvensobjekts nuvarande sekvensnummer och stegvis stegstorlek. Med IDENTITET kan vi återgå till ett visst värde, men vi kan inte ändra stegvis stegstorlek.

5. Sekvensobjekt kan cachas i minnet för att förbättra prestanda, medan Identitetsvärden inte kan cachas.

6. Med en sekvens kan du definiera Min / Max värde. Med Identity-egenskapen stöds detta inte.

 

Syntaxen av SEQUENCE Objects

CREATE SEQUENCE [schema]. [Sekvensnamn] [AS  ] [START MED] [INCREMENT BY] [MINVALUE | NO MINVALUE] [MAXVALUE | INGEN MAXVALUE] [CYCLE | INGEN CYKEL] [CACHE-värde | INGEN CACHE]; 

En sekvens Objektets argument

1. schema: Du kan definiera ett schemanamn medan du skapar sekvensobjekt. Om inget schema tillhandahålls, dbo schema används som standard.

2. Sekvensnamn : Ett unikt namn som ska anges för att identifiera sekvensobjekt

3. Data typ: Datatyper tillåtna med sekvensobjekt är TinyInt, SmallInt, Int, Decimal och BIGINT. Om ingen datatyp tillhandahålls används BIGINT-datatyp som standard.

4. BÖRJA MED: Det första värdet som ska returneras av sekvensobjekt

5. INCREMENT BY: Ett värde som ska användas för att öka eller minska (om negativ) sekvensobjektet; Detta värde kan inte vara 0. Om värdet INCREMENT BY är positivt stiger sekvensobjekten uppåt. Om det är negativt, kommer de nedåt.

6. MINVALUE - Minsta gränsvärde för en sekvens, Det är en valfri parameter, om den inte är definierad, tar det minimivärdet av det definierade datatypintervallet.

7. MAXVALUE: Maximalt gränsvärde för en sekvens, Det är en valfri parameter, om den inte är definierad, tar det maximala värdet av det definierade datatypintervallet.

8. CYCLE | NOCYCLE: Om du vill starta om ett sekvensobjekts värde från ett minimum eller maximalt värde, valfri parameter, är standard NOLL.

9. CACHE | nocache: Öka prestandan genom att aktivera cacheminnet för att minska skivan I / O; Använda CACHE hjälper till att läsa aktuellt värde från minnet.

 

Exempel: Använda SEQUENCE Object med SQL-frågor

1. Skapa ett sekvensobjekt med ett schemanamn, sekvensnamn, datatyp, börja med och öka med argument.

Följande exempel kommer att skapa ett sekvensobjekt som heter ”UniqueSequenceObject.” Det kommer att börja från 1, och värdet ökas med 1 varje gång vi använder "UniqueSequenceObject".

OM EXISTS (SELECT namn FRÅN Sys.sequences WHERE name = 'UniqueSequenceObject') DROP SEQUENCE UniqueSequenceObject GÅ CREATE SEQUENCE dbo.UniqueSequenceObject AS INT START MED 1 INCREMENT AV 1 NO MINVALUE NO MAXVALUE INGEN CYCLE NO CACHE GO 

2. Så här får du det första värdet med ett sekvensobjekt

Följande uttalande returnerar värdet "1" för att få det första värdet med "UniqueSequenceObject."

SELECT value = NEXT VALUE för dbo.UniqueSequenceObject; 
Utgångsvärde ------- 1 

3. Lagring av ett sekvensobjektvärde i en variabel

Följande uttalande kommer att deklarera en variabel och lagra nästa sekvensvärde (dvs "2") i @SequenceValue-variabeln.

DECLARE @SequenceValue som INT; SET @SequenceValue = NÄSTA VÄRDE FÖR DBO. UniqueSequenceObject; SELECT @SequenceValue som SequenceValue; 
Output SequenceValue -------------------- 2 

4. Visa egenskaper för ett sekvensobjekt med hjälp av systemvyn

Följande fråga använder systemets vy sys.sequence för att ge mer information om sekvensobjekt ”UniqueSequenceObject”. Det visar oss ett startvärde, min / maxvärde och ett nuvärde.

välj namn, typ_desc, startvärde, ökning, minimum_värde, maximum_value, nuvarandevärde från sys. sekvenser där namn = 'UniqueSequenceObject'; 

Tabellen nedan visar startvärdet och ökningsvärdet som "1." Vi definierade dessa värden medan du skapade ett sekvensobjekt. Den visar också ett min / max-värde som är gränsvärden för integerdatatypen. Det visar också en current_value "2" som vi använde i Exempel 3 för att lagra den i en variabel.

5. Skapa sekvensobjekt med minsta / maximala värdet gräns

Följande fråga skapar ett sekvensobjekt ”TestSequenceObject”. Den börjar med 100 och ökas med 10 med minimivärdet "100" och maximalt värde "150".

CREATE SEQUENCE dbo.TestSequenceObject AS INT START MED 100 INCREMENT MED 10 MINVALUE 100 MAXVALUE 150 NO CACHE NO CYCLE GO 

Låt oss hämta ett startvärde med hjälp av "TestSequenceObject."

DECLARE @SequenceValue asINT; SET @SequenceValue = NÄSTA VÄRDE FÖR dbo.TestSequenceObject; SELECT @SequenceValue som SequenceValue; 
Output ------------- SequenceValue 100 

Genom att köra frågan nedan kommer vi att överskrida gränsvärdet för sekvensobjektet. Det kommer att ge upphov till ett fel som anger att vi har korsat gränsvärdet för det definierade sekvensobjektet. Med ett GO-uttalande kan vi köra frågan under "5" gånger.

VÄLJ NÄSTA VÄRDE FÖR DBO.TestSequenceObject GO 5 

Vi får följande fel när det nuvarande värdet når gränsvärdet "150".

Msg 11728, Level 16, State 1, Line 16
Sekvensobjektet 'TestSequenceObject' har nått sitt lägsta eller maximala värde. Starta om sekvensobjektet så att nya värden kan genereras.
** Ett fel uppstod under körning av batch. Fortlöpande.
Batch-utförandet slutfördes 5 gånger.

6. Skapa ett sekvensobjekt med CYCLE-egenskapen

I exempel 5 aktiverade vi inte CYCLE-egenskapen hos sekvensobjektet. Genom att använda den här egenskapen kan vi starta om sekvensens objekt från dess lägsta värde för att undvika att kasta felet ovan.

Låt oss skapa ett sekvensobjekt igen med CYCLE-egenskapen och testa om det misslyckas när det når gränsen. När sekvensen når gränsvärdet, börjar det igen från det definierade minimivärdet.

OM EXISTS (SELECT namn FRÅN Sys.sequences WHERE name = 'TestSequenceObject') DROP SEQUENCE TestSequenceObject CREATE SEQUENCE dbo.TestSequenceObject AS INT START MED 100 INCREMENT MED 10 MINVALUE 100 MAXVALUE 150 INGEN CACHE CYCLE GÅ VÄLJ VALV = NÄSTA VÄRDE FÖR DBO.TestSequenceObject GO 10 

7. Använda ett sekvensobjekt med ett INSERT-meddelande

IF OBJECT_ID ('Employee', 'U') ÄR INTE NULL DROP TABLE Employee; CREATE TABLE Medarbetare (EmployeeId INT, Namn VARCHAR (100)); 

Infoga några poster i anställd tabellen med hjälp av sekvensobjekt.

INSERT INTO MEDARBEID (Anställd, Namn) värden (nästa värde för dbo.TestSequenceObject, "Vishwanath"); INSERT INTO Medarbetare (EmployeeId, Name) värden (nästa värde för dbo.TestSequenceObject, 'Dalvi'); VÄLJ * FRÅN MEDARBETARE; 
Output EmployeeId Namn ----------- ------------------- 1 Vishwanath 2 Dalvi 

Läs mer om databas- och SQL-programmering som publiceras på Tech-Recipes.