Anteckning
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
              gäller för:SQL Server
Azure SQL Database
Azure SQL Managed Instance
Skapar ett sekvensobjekt och anger dess egenskaper. En sekvens är ett användardefinierat schemabundet objekt som genererar en sekvens med numeriska värden enligt specifikationen som sekvensen skapades med. Sekvensen med numeriska värden genereras i en stigande eller fallande ordning med ett definierat intervall och kan konfigureras för att starta om (cykel) när den är slut.
Sekvenser, till skillnad från identitetskolumner, är inte associerade med specifika tabeller. Program refererar till ett sekvensobjekt för att hämta nästa värde. Relationen mellan sekvenser och tabeller styrs av programmet. Användarprogram kan referera till ett sekvensobjekt och samordna värdena över flera rader och tabeller.
Till skillnad från värden för identitetskolumner som genereras när rader infogas kan ett program hämta nästa sekvensnummer utan att infoga raden genom att anropa NÄSTA VÄRDE FÖR. Använd sp_sequence_get_range för att hämta flera sekvensnummer samtidigt.
Information och scenarier som använder både CREATE SEQUENCE och funktionen finns i NEXT VALUE FORSekvensnummer.
              
              
              Transact-SQL syntaxkonventioner
Syntax
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 } ]
    [ ; ]
Arguments
sequence_name
Anger det unika namn med vilket sekvensen är känd i databasen. Typen är sysname.
[ built_in_integer_type | user-defined_integer_type ]
En sekvens kan definieras som vilken heltalstyp som helst. Följande typer tillåts.
- tinyint - Intervall 0 till 255
 - smallint – Intervall -32 768 till 32 767
 - int – Intervall -2 147 483 648 till 2 147 483 647
 - bigint – Intervall -9 223 372 036 854 775 808 till 9 223 372 036 854 775 807
 - decimal och numeriskt med en skala på 0.
 - Alla användardefinierade datatyper (aliastyp) som baseras på någon av de tillåtna typerna.
 
Om ingen datatyp anges används bigint-datatypen som standard.
BÖRJA MED <konstant>
Det första värdet som returneras av sekvensobjektet. Värdet START måste vara ett värde som är mindre än eller lika med maxvärdet och större än eller lika med sekvensobjektets minsta värde. Standardstartvärdet för ett nytt sekvensobjekt är det lägsta värdet för ett stigande sekvensobjekt och det maximala värdet för ett fallande sekvensobjekt.
INKREMENT BY <constant>
Värde som används för att öka (eller minska om det är negativt) värdet för sekvensobjektet för varje anrop till NEXT VALUE FOR funktionen. Om inkrementet är ett negativt värde är sekvensobjektet fallande. annars är den stigande. Inkrementet får inte vara 0. Standardökningen för ett nytt sekvensobjekt är 1.
[ MINVALUE-konstant <> | INGEN MINVALUE ]
Anger gränserna för sekvensobjektet. Standardvärdet för ett nytt sekvensobjekt är det minsta värdet för datatypen för sekvensobjektet. Det här är noll för den lilla datatypen och ett negativt tal för alla andra datatyper.
[ MAXVALUE-konstant <> | NO MAXVALUE
Anger gränserna för sekvensobjektet. Det högsta standardvärdet för ett nytt sekvensobjekt är det maximala värdet för datatypen för sekvensobjektet.
[ CYCLE | INGEN CYKEL ]
Egenskap som anger om sekvensobjektet ska startas om från minimivärdet (eller maxvärdet för fallande sekvensobjekt) eller utlöser ett undantag när dess lägsta eller högsta värde överskrids. Standardalternativet för cykel för nya sekvensobjekt är NO CYCLE.
Anmärkning
Cykling startar SEQUENCE om från det lägsta eller högsta värdet, inte från startvärdet.
[ CACHE [ <konstant> ] | INGEN CACHE ]
Ökar prestandan för program som använder sekvensobjekt genom att minimera antalet disk-IO:er som krävs för att generera sekvensnummer. Standardinställningen är CACHE.
Om till exempel en cachestorlek på 50 väljs behåller SQL Server inte 50 enskilda värden cachelagrade. Det cachelagrar bara det aktuella värdet och mängden värden som finns kvar i cacheminnet. Det innebär att mängden minne som krävs för att lagra cachen alltid är två instanser av sekvensobjektets datatyp.
Anmärkning
Om cachealternativet är aktiverat utan att ange en cachestorlek väljer databasmotorn en storlek. Användarna bör dock inte förlita sig på att valet är konsekvent. Microsoft kan ändra metoden för att beräkna cachestorleken utan föregående meddelande.
När du skapar med CACHE alternativet kan en oväntad avstängning (till exempel ett strömavbrott) leda till förlust av sekvensnummer som finns kvar i cacheminnet.
Anmärkningar
Sekvensnummer genereras utanför den aktuella transaktionens omfång. De används oavsett om transaktionen med sekvensnumret har checkats in eller återställts. Dubblettvering sker bara när en post är helt ifylld. 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 dubblett. Om detta inträffar och andra autonumreringsvärden har tillämpats på efterföljande poster kan detta resultera i ett mellanrum mellan autonumrervärden och är förväntat beteende.
Cachehantering
För att förbättra prestandan förallokerar SQL Server det antal 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 senast cachelagrade värdet (15) skrivs till systemtabellerna på disken. När alla 15 tal används kommer nästa begäran (för nummer 16) att göra att cachen allokeras igen. Det nya senast cachelagrade värdet (30) skrivs till systemtabellerna.
Om databasmotorn stoppas efter att du har använt 22 tal skrivs nästa avsedda sekvensnummer i minnet (23) till systemtabellerna och ersätter det tidigare lagrade talet.
När SQL Server startas om och ett sekvensnummer behövs läss startnumret från systemtabellerna (23). Cachemängden på 15 tal (23–38) allokeras till minnet och nästa icke-cachenummer (39) skrivs till systemtabellerna.
Om databasmotorn stoppas onormalt för en händelse, till exempel ett strömavbrott, startas sekvensen om med talet läst från systemtabeller (39). Alla sekvensnummer som allokeras till minnet (men som aldrig begärts av en användare eller ett program) går förlorade. Den här funktionen kan lämna luckor, men garanterar att samma värde aldrig utfärdas två gånger för ett enda sekvensobjekt om det inte definieras som CYCLE eller startas om manuellt.
Cachen underhålls i minnet genom att spåra det aktuella värdet (det senaste värdet som utfärdades) och mängden värden som finns kvar i cacheminnet. Därför är mängden minne som används av cachen alltid två instanser av datatypen för sekvensobjektet.
Ange cacheargumentet till att NO CACHE skriva det aktuella sekvensvärdet till systemtabellerna varje gång en sekvens används. Detta kan försämra prestandan genom att öka diskåtkomsten, men minskar risken för oavsiktliga luckor. Luckor kan fortfarande uppstå om tal begärs med hjälp av NEXT VALUE FOR funktionerna eller sp_sequence_get_range , men då används inte talen eller används i icke-utelämnade transaktioner.
När ett sekvensobjekt använder CACHE alternativet, om du startar om sekvensobjektet eller ändrar INCREMENTegenskaperna , CYCLE, MINVALUE, MAXVALUEeller cachestorleken, kommer cachen att skrivas till systemtabellerna innan ändringen sker. Sedan laddas cacheminnet om från och med det aktuella värdet (det vill: inga tal hoppas över). Ändring av cachestorleken börjar gälla omedelbart.
Cachealternativ 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 CACHE alternativet om det finns oanvända värden tillgängliga i minnesintern cache för sekvensobjektet.
- Nästa värde för sekvensobjektet beräknas.
 - Det nya aktuella värdet för sekvensobjektet uppdateras i minnet.
 - Det beräknade värdet returneras till anropande instruktion.
 
CACHE-alternativ när cachen är slut
Följande process inträffar varje gång ett sekvensobjekt begärs för att generera nästa värde för CACHE alternativet om cachen är slut:
Nästa värde för sekvensobjektet beräknas.
Det sista värdet för den nya cachen beräknas.
Systemtabellraden för sekvensobjektet är låst och värdet som beräknas i steg 2 (det sista värdet) skrivs till systemtabellen. En cachetömd utökad händelse utlöses för att meddela användaren om det nya beständiga värdet.
ALTERNATIVET INGEN CACHE
Följande process inträffar varje gång ett sekvensobjekt begärs för att generera nästa värde för NO CACHE alternativet:
- Nästa värde för sekvensobjektet beräknas.
 - Det nya aktuella värdet för sekvensobjektet skrivs till systemtabellen.
 - Det beräknade värdet returneras till anropande instruktion.
 
Metainformation
För information om sekvenser, fråga sys.sequences.
Security
Permissions
Kräver CREATE SEQUENCE, ALTEReller CONTROL behörighet för SCHEMA.
- 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 generera tal.
 
I följande exempel ges användaren AdventureWorks\Larry behörighet att skapa sekvenser i Test schemat.
GRANT CREATE SEQUENCE
    ON SCHEMA::Test TO [AdventureWorks\Larry];
Ägarskap för ett sekvensobjekt kan överföras med hjälp av -instruktionen ALTER AUTHORIZATION .
Om en sekvens använder en användardefinierad datatyp måste sekvensens skapare ha REFERENCES behörighet för typen.
Audit
Om du vill granska CREATE SEQUENCEövervakar du SCHEMA_OBJECT_CHANGE_GROUP.
Examples
Exempel på hur du skapar sekvenser och använder NEXT VALUE FOR funktionen för att generera sekvensnummer finns i Sekvensnummer.
De flesta av följande exempel skapar sekvensobjekt i ett schema med namnet Test.
Kör följande instruktion för att skapa testschemat.
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 det används.
CREATE SEQUENCE Test.CountByNeg1
    START WITH 0
    INCREMENT BY -1;
GO
C. Skapa en sekvens som ökar med 5
I följande exempel skapas 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
När du har importerat en tabell ser Thierry att det högsta ID-numret som används är 24 328. Thierry behöver en sekvens som genererar tal som börjar på 24 329. Följande kod skapar en sekvens som börjar med 24 329 och ökar med 1.
CREATE SEQUENCE Test.ID_Seq
    START WITH 24329
    INCREMENT BY 1;
GO
E. Skapa en sekvens med standardvärden
I följande exempel skapas en sekvens med standardvärdena.
CREATE SEQUENCE Test.TestSequence;
Kör följande instruktion för att visa sekvensens egenskaper.
SELECT *
FROM sys.sequences
WHERE name = 'TestSequence';
En partiell lista över utdata visar standardvärdena.
| Utgång | Standardvärde | 
|---|---|
start_value | 
-9223372036854775808 | 
increment | 
1 | 
minimum_value | 
-9223372036854775808 | 
maximum_value | 
9223372036854775807 | 
is_cycling | 
0 | 
is_cached | 
1 | 
current_value | 
-9223372036854775808 | 
F. Skapa en sekvens med en specifik datatyp
I följande exempel skapas en sekvens med datatypen smallint , med ett intervall från -32 768 till 32 767.
CREATE SEQUENCE SmallSeq
    AS SMALLINT;
G. Skapa en sekvens med alla argument
I följande exempel skapas en sekvens med namnet DecSeq med hjälp av decimaldatatypen med ett intervall från 0 till 255. Sekvensen börjar med 125 och ökar med 25 varje gång ett tal genereras. Eftersom sekvensen är konfigurerad att växla när värdet överskrider det maximala värdet på 200 startas sekvensen om med minimivärdet 100.
CREATE SEQUENCE Test.DecSeq
    AS DECIMAL (3, 0)
    START WITH 125
    INCREMENT BY 25
    MINVALUE 100
    MAXVALUE 200
    CYCLE
    CACHE 3;
Kör följande instruktion för att se det första värdet. alternativet START WITH 125.
SELECT  NEXT VALUE FOR Test.DecSeq;
Kör instruktionen tre gånger till för att returnera 150, 175 och 200.
Kör instruktionen igen för att se hur startvärdet växlar 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';