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 er et brukerdefinert skjemabundet objekt som genererer en sekvens med numeriske verdier i henhold til spesifikasjonen som sekvensen ble opprettet med. Sekvensen av numeriske verdier genereres i stigende eller synkende rekkefølge med et definert intervall og kan konfigureres til å starte på nytt (syklus) når den er oppbrukt. Sekvenser, i motsetning til identitetskolonner, er ikke knyttet til bestemte tabeller. Programmer refererer til et sekvensobjekt for å hente neste verdi. Forholdet mellom sekvenser og tabeller styres av programmet. Brukerprogrammer kan referere til et sekvensobjekt og koordinere verdiene på tvers av flere rader og tabeller.

I Motsetning til verdier for identitetskolonner som genereres når rader settes inn, kan et program hente det neste sekvensnummeret uten å sette inn raden ved å kalle DEN NESTE VERDIEN for funksjon. Bruk sp_sequence_get_range for å få flere sekvensnumre samtidig.

Hvis du vil ha informasjon og scenarier som bruker BÅDE OPPRETT SEKVENS og NESTE VERDI for funksjon, kan Du se Sekvensnumre.

Emne link ikonTransact-SQL Syntaks Konvensjoner

Syntaks

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

Merk

for å vise Transact-SQL syntaks FOR SQL Server 2014 og tidligere, se tidligere versjoner dokumentasjon.

Argumenter

sequence_name
Angir det unike navnet som sekvensen er kjent med i databasen. Type er sysname.

Angir grensene for sekvensobjektet. Standard minimumsverdi for et nytt sekvensobjekt er minimumsverdien for datatypen for sekvensobjektet. Dette er null for tinyint-datatypen og et negativt tall for alle andre datatyper.

Egenskap som angir om sekvensobjektet skal starte på nytt fra minimumsverdien (eller maksimum for synkende sekvensobjekter) eller kaste et unntak når minimums-eller maksimumsverdien overskrides. Standard syklus for nye sekvensobjekter er INGEN SYKLUS.Sykling En SEKVENS starter på nytt fra minimums-eller maksimumsverdien, ikke fra startverdien.

/ NO CACHE]
Øker ytelsen for programmer som bruker sekvensobjekter ved å minimere Antall disk IOs som kreves for å generere sekvensnumre. Standard TIL CACHE.

HVIS for eksempel en bufferstørrelse på 50 er valgt, BEHOLDER IKKE SQL Server 50 individuelle verdier bufret. Det bufrer bare gjeldende verdi og antall verdier igjen i hurtigbufferen. Dette betyr at mengden minne som kreves for å lagre hurtigbufferen, alltid er to forekomster av datatypen for sekvensobjektet.

Merk

Hvis hurtigbufferalternativet er aktivert uten å angi en hurtigbufferstørrelse, Velger Databasemotoren en størrelse. Brukerne bør imidlertid ikke stole på at utvalget er konsistent. Microsoft kan endre metoden for beregning av hurtigbufferstørrelsen uten varsel.

når det opprettes MED HURTIGBUFFERALTERNATIVET, kan en uventet avslutning (for eksempel strømbrudd) føre til tap av sekvensnumre som er igjen i hurtigbufferen.

Generelle Merknader

Sekvensnumre genereres utenfor omfanget av gjeldende transaksjon. De forbrukes om transaksjonen ved hjelp av sekvensnummeret er begått eller rullet tilbake. Duplikat validering skjer bare når en post er fullt fylt ut. Dette kan resultere i noen tilfeller der det samme nummeret brukes for mer enn en post under oppretting, men deretter blir identifisert som et duplikat. Hvis dette skjer og andre autonummerverdier er brukt på etterfølgende poster, kan dette føre til et mellomrom mellom autonummerverdier og forventet virkemåte.

Cache management

HVIS DU vil forbedre ytelsen, tildeler SQL Server antall sekvensnumre som er angitt AV CACHE-argumentet.

for eksempel opprettes en ny sekvens med en startverdi på 1 og en bufferstørrelse på 15. Når den første verdien er nødvendig, blir verdiene 1 til 15 gjort tilgjengelig fra minnet. Den siste bufrede verdien (15) skrives til systemtabellene på disken. Når alle 15 tallene brukes, vil neste forespørsel (for nummer 16) føre til at cachen blir tildelt igjen. Den nye siste bufrede verdien (30) skrives til systemtabellene.

hvis Databasemotoren stoppes etter at du har brukt 22 tall, skrives det neste tiltenkte sekvensnummeret i minnet (23) til systemtabellene, og erstatter det tidligere lagrede nummeret.

ETTER AT SQL Server har startet på nytt og et sekvensnummer er nødvendig, leses startnummeret fra systemtabellene (23). Cachemengden på 15 tall (23-38) er allokert til minne og neste ikke-cachenummer (39) er skrevet til systemtabellene.

Hvis Databasemotoren stopper unormalt for en hendelse, for eksempel et strømbrudd, starter sekvensen på nytt med nummeret lest fra systemtabeller (39). Eventuelle sekvensnumre allokert til minne (men aldri forespurt av en bruker eller et program) går tapt. Denne funksjonaliteten kan etterlate hull, men garanterer at den samme verdien aldri vil bli utstedt to ganger for et enkelt sekvensobjekt, med mindre DEN er definert SOM SYKLUS eller startes manuelt.

hurtigbufferen opprettholdes i minnet ved å spore gjeldende verdi (den siste utstedte verdien) og antall verdier som er igjen i hurtigbufferen. Derfor er mengden minne som brukes av hurtigbufferen alltid to forekomster av datatypen for sekvensobjektet.

Angi bufferargumentet TIL INGEN BUFFER skriver gjeldende sekvensverdi til systemtabellene hver gang en sekvens brukes. Dette kan redusere ytelsen ved å øke disktilgangen, men reduserer sjansen for utilsiktede hull. Hull kan fortsatt oppstå hvis tall blir bedt om Å bruke DEN NESTE VERDIEN for eller sp_sequence_get_range funksjoner, men da tallene er enten ikke brukt eller brukes i uforpliktet transaksjoner.

når et sekvensobjekt bruker HURTIGBUFFERALTERNATIVET, hvis du starter sekvensobjektet på nytt eller endrer EGENSKAPENE FOR ØKNING, SYKLUS, MINVERDI, MAKSVERDI eller hurtigbufferstørrelse, vil det føre til at hurtigbufferen skrives til systemtabellene før endringen skjer. Deretter lastes cachen på nytt med dagens verdi (dvs.ingen tall hoppes over). Endring av hurtigbufferstørrelsen trer i kraft umiddelbart.

BUFFERALTERNATIV når bufrede verdier er tilgjengelige

følgende prosess skjer hver gang et sekvensobjekt blir bedt om å generere den neste verdien for HURTIGBUFFEREN hvis det er ubrukte verdier tilgjengelig i hurtigbufferen i minnet for sekvensobjektet.

  1. den neste verdien for sekvensobjektet beregnes.

  2. den nye gjeldende verdien for sekvensobjektet oppdateres i minnet.

  3. den beregnede verdien returneres til calling-setningen.

HURTIGBUFFERALTERNATIV når hurtigbufferen er oppbrukt

følgende prosess skjer hver gang et sekvensobjekt blir bedt om å generere neste verdi for HURTIGBUFFERALTERNATIVET hvis hurtigbufferen er oppbrukt:

  1. den neste verdien for sekvensobjektet beregnes.

  2. den siste verdien for den nye hurtigbufferen beregnes.

  3. systemtabellraden for sekvensobjektet er låst, og verdien beregnet i trinn 2 (den siste verdien) skrives til systemtabellen. En cache-oppbrukt xevent utløses for å varsle brukeren om den nye vedvarende verdien.

ingen CACHE-alternativ

følgende prosess skjer hver gang et sekvensobjekt blir bedt om å generere neste verdi for ALTERNATIVET INGEN CACHE:

  1. den neste verdien for sekvensobjektet beregnes.

  2. den nye gjeldende verdien for sekvensobjektet skrives til systemtabellen.

  3. den beregnede verdien returneres til calling-setningen.

Metadata

for informasjon om sekvenser, spør sys.rekkefølge.

Sikkerhet

Tillatelser

Krever OPPRETT SEKVENS, ENDRE eller KONTROLLER tillatelse i SKJEMAET.Medlemmer av db_owner og db_ddladmin faste databaseroller kan opprette, endre og slippe sekvensobjekter.Medlemmer av db_owner og db_datawriter faste databaseroller kan oppdatere sekvensobjekter ved å få dem til å generere tall.

følgende eksempel gir Brukeren AdventureWorks \ Larry tillatelse til å opprette sekvenser i Testskjemaet.

GRANT CREATE SEQUENCE ON SCHEMA::Test TO 

Eierskap av et sekvensobjekt kan overføres ved HJELP AV ENDRE AUTORISASJONSERKLÆRINGEN.

hvis en sekvens bruker en brukerdefinert datatype, må skaperen av sekvensen HA REFERANSETILLATELSE for typen.

Audit

hvis du vil overvåke OPPRETT SEKVENS, overvåker DU SCHEMA_OBJECT_CHANGE_GROUP.

Eksempler

Hvis du vil ha eksempler på å opprette sekvenser og bruke den NESTE VERDIEN for funksjonen til å generere sekvensnumre, kan Du se Sekvensnumre.

de fleste av eksemplene nedenfor oppretter sekvensobjekter i et skjema Med Navnet Test.

for å opprette Testskjemaet, utfør følgende setning.

CREATE SCHEMA Test ; GO 

A. Opprette en sekvens som øker med 1

I følgende eksempel oppretter Thierry en sekvens kalt CountBy1 som øker med en hver gang den brukes.

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

B. Opprette en sekvens som reduseres med 1

følgende eksempel starter ved 0 og teller til negative tall med en hver gang den brukes.

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

C. Opprette en sekvens som øker med 5

følgende eksempel oppretter en sekvens som øker med 5 hver gang den brukes.

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

D. Ved å Opprette en sekvens som starter med et angitt nummer

etter at du har importert en tabell, merker Thierry at det høyeste ID-nummeret som brukes er 24 328. Thierry trenger en sekvens som vil generere tall som starter på 24,329. Følgende kode oppretter en sekvens som starter med 24 329 og øker med 1.

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

E. Opprette en sekvens ved hjelp av standardverdier

følgende eksempel oppretter en sekvens ved hjelp av standardverdiene.

CREATE SEQUENCE Test.TestSequence ; 

Utfør følgende setning for å vise egenskapene til sekvensen.

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

en delvis liste over utdataene viser standardverdiene.

1

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

f. opprette en sekvens med en bestemt datatype

følgende eksempel oppretter en sekvens ved hjelp av smallint-datatypen, med et område fra -32 768 til 32 767.

CREATE SEQUENCE SmallSeq AS smallint ; 

G. Opprette en sekvens ved hjelp av alle argumenter

følgende eksempel oppretter En sekvens med Navnet DecSeq ved hjelp av desimaldatatypen, med et område fra 0 til 255. Sekvensen starter med 125 og øker med 25 hver gang et tall genereres. Fordi sekvensen er konfigurert til å sykle når verdien overstiger maksimumsverdien på 200, starter sekvensen på nytt med minimumsverdien 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ølgende setning for å se den første verdien;START WITH alternativet 125.

SELECT NEXT VALUE FOR Test.DecSeq; 

Utfør setningen tre ganger for å returnere 150, 175 og 200.

Utfør setningen på nytt for å se hvordan startverdien går tilbake til MINVALUE – alternativet på 100.

Kjør følgende kode for å bekrefte cachestørrelsen og se gjeldende verdi.

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

Se Også

ENDRE SEKVENS (Transact-SQL)
SLIPP SEKVENS (Transact-SQL)
NESTE VERDI for (Transact-SQL)
Sekvensnumre

Legg igjen en kommentar

Din e-postadresse vil ikke bli publisert.