CREATE SEQUENCE (Transact-SQL)

  • 04/11/2017
  • 10 minutes to read
    • W
    • c
    • r
    • M
    • m
    • +7

Applies to: yesSQL Server (all supported versions) YesAzure SQL Database

Creates a sequence object and specifies its properties. En sekvens är ett användardefinierat schemabundet objekt som genererar en sekvens av numeriska värden enligt specifikationen med vilken sekvensen skapades. Sekvensen av numeriska värden genereras i stigande eller fallande ordning vid ett definierat intervall och kan konfigureras för att starta om (cykel) när den är uttömd. Sekvenser, till skillnad från identitetskolumner, är inte associerade med specifika tabeller. Applikationer hänvisar till ett sekvensobjekt för att hämta nästa värde. Förhållandet mellan sekvenser och tabeller styrs av applikationen. Användarprogram kan referera till ett sekvensobjekt och samordna värdena över flera rader och tabeller.

Till skillnad från identitetskolumner värden som genereras när rader infogas, kan ett program få nästa sekvensnummer utan att infoga raden genom att anropa nästa värde för funktion. Använd sp_sequence_get_range för att få flera sekvensnummer samtidigt.

För information och scenarier som använder både skapa sekvens och nästa värde för funktion, se sekvensnummer.

Topic link icon Transact-SQL Syntax konventioner

Syntax

CREATE SEQUENCE sequence_name ] } | { NO MINVALUE } ] } | { NO MAXVALUE } ] } | { NO CACHE } ] 

Obs

för att visa Transact-SQL syntax för SQL Server 2014 och tidigare, se tidigare versioner dokumentation.

argument

sequence_name
anger det unika namn med vilket sekvensen är känd i databasen. Typ är sysname.

anger gränserna för sekvensobjektet. Standardvärdet för ett nytt sekvensobjekt är minimivärdet för datatypen för sekvensobjektet. Detta är noll för tinyint-datatypen och ett negativt tal för alla andra datatyper.

egenskap som anger om sekvensobjektet ska startas om från minimivärdet (eller maximalt för fallande sekvensobjekt) eller kasta ett undantag när dess minsta eller maximala värde överskrids. Standardcykelalternativet för nya sekvensobjekt är ingen cykel.

Obs

Cykling en sekvens startas om från minimi-eller maximivärdet, inte från startvärdet.

/ ingen CACHE]
ökar prestanda för applikationer som använder sekvensobjekt genom att minimera antalet iOS-skivor som krävs för att generera sekvensnummer. Standard för CACHE.

till exempel, om en cachestorlek på 50 väljs, behåller SQL Server inte 50 enskilda värden cachade. Det cachar bara det aktuella värdet och antalet värden kvar i cachen. Det betyder att mängden minne som krävs för att lagra cachen alltid är två instanser av datatypen för sekvensobjektet.

Obs

Om alternativet cache är aktiverat utan att ange en cachestorlek väljer databasmotorn en storlek. Användare bör dock inte lita på att valet är konsekvent. Microsoft kan ändra metoden för att beräkna cachestorleken utan föregående meddelande.

När det skapas med alternativet CACHE kan en oväntad avstängning (t.ex. ett strömavbrott) leda till förlust av sekvensnummer som finns kvar i cachen.

Allmänna anmärkningar

sekvensnummer genereras utanför ramen för den aktuella transaktionen. De förbrukas om transaktionen med sekvensnumret är engagerad eller rullad tillbaka. Duplicerad validering sker endast när en post är fullt befolkad. Detta kan resultera i vissa fall där samma nummer används för mer än en post under skapandet, men sedan identifieras som en duplikat. Om detta inträffar och andra autonumbervärden har tillämpats på efterföljande poster kan detta resultera i ett gap mellan autonumbervärden och förväntat beteende.

Cache management

för att förbättra prestanda, tilldelar SQL Server antalet sekvensnummer som anges av CACHE-argumentet.

till exempel skapas en ny sekvens med ett startvärde på 1 och en cachestorlek på 15. När det första värdet behövs görs värdena 1 till 15 tillgängliga från minnet. Det sista cachade värdet (15) skrivs till systemtabellerna på disken. När alla 15 nummer används, kommer nästa begäran (för nummer 16) att cachen tilldelas igen. Det nya senast cachade värdet (30) kommer att skrivas till systemtabellerna.

om databasmotorn stoppas efter att du har använt 22 nummer skrivs nästa avsedda sekvensnummer i minnet (23) till systemtabellerna och ersätter det tidigare lagrade numret.

När SQL Server startas om och ett sekvensnummer behövs läses startnumret från systemtabellerna (23). Cachemängden på 15 nummer (23-38) tilldelas minnet och nästa icke-cachenummer (39) skrivs till systemtabellerna.

om databasmotorn stannar onormalt för en händelse, t.ex. ett strömavbrott, startar sekvensen om med numret som läses från systemtabeller (39). Alla sekvensnummer som tilldelas minnet (men aldrig begärts av en användare eller ett program) går förlorade. Denna funktion kan lämna luckor, men garanterar att samma värde aldrig kommer att utfärdas två gånger för ett enda sekvensobjekt om det inte definieras som cykel eller startas om manuellt.

cachen bibehålls i minnet genom att spåra det aktuella värdet (det senast utfärdade värdet) och antalet värden kvar i cachen. Därför är mängden minne som används av cachen alltid två instanser av datatypen för sekvensobjektet.

Inställning av cache-argumentet till ingen CACHE skriver det aktuella sekvensvärdet till systemtabellerna varje gång en sekvens används. Detta kan bromsa prestanda genom att öka diskåtkomst, men minskar risken för oavsiktliga luckor. Luckor kan fortfarande uppstå om tal begärs med hjälp av nästa värde för eller sp_sequence_get_range funktioner, men då siffrorna antingen inte används eller används i obekräftade transaktioner.

När ett sekvensobjekt använder alternativet CACHE, om du startar om sekvensobjektet eller ändrar egenskaperna inkrement, CYCLE, MINVALUE, MAXVALUE eller cachestorlek, kommer cachen att skrivas till systemtabellerna innan ändringen inträffar. Sedan laddas cachen om med början med det aktuella värdet (dvs. inga nummer hoppas över). Ändring av cachestorlek träder i kraft omedelbart.

CACHE-alternativ när cachelagrade värden är tillgängliga

följande process inträffar varje gång ett sekvensobjekt begärs för att generera nästa värde för alternativet CACHE om det finns oanvända värden tillgängliga i cache-minnet för sekvensobjektet.

  1. nästa värde för sekvensobjektet beräknas.

  2. det nya aktuella värdet för sekvensobjektet uppdateras i minnet.

  3. det beräknade värdet returneras till anropssatsen.

CACHE alternativ när cachen är uttömd

följande process sker varje gång ett sekvensobjekt begärs för att generera nästa värde för alternativet CACHE om cachen har tömts:

  1. nästa värde för sekvensobjektet beräknas.

  2. det sista värdet för den nya cachen beräknas.

  3. systemtabellraden för sekvensobjektet är låst och värdet beräknat i steg 2 (Det sista värdet) skrivs till systemtabellen. En cache-uttömd xevent avfyras för att meddela användaren om det nya kvarstående värdet.

ingen CACHE alternativ

följande process sker varje gång ett sekvensobjekt begärs för att generera nästa värde för alternativet Ingen CACHE:

  1. nästa värde för sekvensobjektet beräknas.

  2. det nya aktuella värdet för sekvensobjektet skrivs till systemtabellen.

  3. det beräknade värdet returneras till anropssatsen.

Metadata

För information om sekvenser, fråga sys.sekvens.

säkerhet

behörigheter

kräver skapa sekvens, ändra eller kontrollera tillstånd på schemat.

  • medlemmar i db_owner och db_ddladmin fasta databasroller kan skapa, ändra och släppa sekvensobjekt.

  • medlemmar i db_owner och db_datawriter fasta databasroller kan uppdatera sekvensobjekt genom att få dem att generera tal.

följande exempel ger användaren AdventureWorks \ Larry behörighet att skapa sekvenser i Testschemat.

GRANT CREATE SEQUENCE ON SCHEMA::Test TO 

ägande av ett sekvensobjekt kan överföras med hjälp av Alter AUTHORIZATION-uttalandet.

om en sekvens använder en användardefinierad datatyp måste skaparen av sekvensen ha REFERENSBEHÖRIGHET för typen.

revision

för att granska skapa sekvens, övervaka SCHEMA_OBJECT_CHANGE_GROUP.

exempel

För exempel på att skapa sekvenser och använda nästa värde för funktion för att generera sekvensnummer, se sekvensnummer.

de flesta av följande exempel skapar sekvensobjekt i ett schema med namnet Test.

för att skapa Testschemat, kör följande uttalande.

CREATE SCHEMA Test ; GO 

A. skapa en sekvens som ökar med 1

i följande exempel skapar Thierry en sekvens med namnet CountBy1 som ökar med en varje gång den används.

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

B. skapa en sekvens som minskar med 1

följande exempel börjar vid 0 och räknas till negativa tal med en varje gång den används.

CREATE SEQUENCE Test.CountByNeg1 START WITH 0 INCREMENT BY -1 ; GO 

C. Skapa en sekvens som ökar med 5

följande exempel skapar en sekvens som ökar med 5 varje gång den används.

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

D. skapa en sekvens som börjar med ett angivet nummer

Efter att ha importerat en tabell märker Thierry att det högsta ID-numret som används är 24 328. Thierry behöver en sekvens som kommer att generera siffror som börjar vid 24,329. Följande kod skapar en sekvens som börjar med 24,329 och steg med 1.

CREATE SEQUENCE Test.ID_Seq START WITH 24329 INCREMENT BY 1 ; GO 

E. Skapa en sekvens med standardvärden

följande exempel skapar en sekvens med standardvärdena.

CREATE SEQUENCE Test.TestSequence ; 

utför följande uttalande för att visa sekvensens egenskaper.

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

en partiell lista över utdata visar standardvärdena.

Output Default value
start_value -9223372036854775808
increment 1
mimimum_value -9223372036854775808
maximum_value 9223372036854775807
is_cycling 0
is_cached 1
current_value -9223372036854775808

F. skapa en sekvens med en specifik datatyp

följande exempel skapar en sekvens med smallint-datatypen, med ett intervall från -32 768 till 32 767.

CREATE SEQUENCE SmallSeq AS smallint ; 

G. skapa en sekvens med alla argument

följande exempel skapar en sekvens med namnet DecSeq med decimaldatatypen, med ett intervall från 0 till 255. Sekvensen börjar med 125 och steg med 25 varje gång ett tal genereras. Eftersom sekvensen är konfigurerad att cykla när värdet överstiger det maximala värdet på 200, startar sekvensen om till det lägsta värdet på 100.

CREATE SEQUENCE Test.DecSeq AS decimal(3,0) START WITH 125 INCREMENT BY 25 MINVALUE 100 MAXVALUE 200 CYCLE CACHE 3 ; 

utför följande uttalande för att se det första värdet; alternativetSTART WITH 125.

SELECT NEXT VALUE FOR Test.DecSeq; 

utför uttalandet tre gånger för att returnera 150, 175 och 200.

kör uttalandet igen för att se hur startvärdet cyklar tillbaka till MINVALUE alternativet 100.

kör följande kod för att bekräfta cachestorleken och se det aktuella värdet.

SELECT cache_size, current_value FROM sys.sequences WHERE name = 'DecSeq' ; 

Se även

ändra sekvens (Transact-SQL)
släpp sekvens(Transact-SQL)
Nästa värde för (Transact-SQL)
sekvensnummer

Lämna ett svar

Din e-postadress kommer inte publiceras.