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. Een reeks is een door de gebruiker gedefinieerd schemagebonden object dat een reeks numerieke waarden genereert volgens de specificatie waarmee de reeks is gemaakt. De reeks numerieke waarden wordt gegenereerd in oplopende of aflopende volgorde met een bepaald interval en kan worden geconfigureerd om opnieuw op te starten (cyclus) wanneer uitgeput. Sequenties, in tegenstelling tot identiteitskolommen, worden niet geassocieerd met specifieke tabellen. Toepassingen verwijzen naar een sequentieobject om de volgende waarde op te halen. De relatie tussen sequenties en tabellen wordt gecontroleerd door de toepassing. Gebruikerstoepassingen kunnen verwijzen naar een sequentieobject en de waarden over meerdere rijen en tabellen coördineren.

In tegenstelling tot waarden voor identiteitskolommen die worden gegenereerd wanneer rijen worden ingevoegd, kan een toepassing het volgende volgnummer verkrijgen zonder de rij in te voegen door de volgende waarde voor functie aan te roepen. Gebruik sp_sequence_get_range om meerdere volgnummers tegelijk te krijgen.

voor informatie en scenario ‘ s die zowel create SEQUENCE als de NEXT VALUE for function gebruiken, zie volgnummers.

Topic link icon Transact-SQL syntaxis conventies

Syntax

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

opmerking

om de Transact-SQL syntaxis voor SQL Server 2014 en eerder te bekijken, zie de documentatie van vorige versies.

argumenten

sequence_name
specificeert de unieke naam waaronder de reeks bekend is in de database. Type is sysname.

specificeert de grenzen voor het object van de reeks. De standaard minimumwaarde voor een nieuw sequentieobject is de minimumwaarde van het gegevenstype van het sequentieobject. Dit is nul voor het tinyint gegevenstype en een negatief getal voor alle andere gegevenstypen.

eigenschap die specificeert of het sequentieobject moet herstarten vanaf de minimumwaarde (of maximum voor aflopende sequentieobjecten) of een uitzondering moet maken wanneer de minimum-of maximumwaarde wordt overschreden. De standaard cyclus optie voor nieuwe sequence objecten is geen cyclus.

Note

Cycling a SEQUENCE herstart vanaf de minimum-of maximumwaarde, niet vanaf de startwaarde.

/ NO CACHE]
verhoogt de prestaties voor toepassingen die sequentieobjecten gebruiken door het minimaliseren van het aantal disk IOs dat nodig is om sequentienummers te genereren. Standaard ingesteld op CACHE.

bijvoorbeeld, als een cachegrootte van 50 wordt gekozen, houdt SQL Server geen 50 individuele waarden in de cache. Het caches alleen de huidige waarde en het aantal waarden links in de cache. Dit betekent dat de hoeveelheid geheugen die nodig is om de cache op te slaan altijd twee exemplaren van het gegevenstype van het sequence object is.

Note

als de cache-optie is ingeschakeld zonder een cachegrootte op te geven, zal de Database-Engine een grootte selecteren. Gebruikers moeten er echter niet op vertrouwen dat de selectie consistent is. Microsoft kan de methode voor het berekenen van de cachegrootte wijzigen zonder kennisgeving.

wanneer deze met de CACHE-optie wordt aangemaakt, kan een onverwachte uitschakeling (zoals een stroomstoring) resulteren in het verlies van volgnummers in de cache.

Algemene opmerkingen

volgnummers worden gegenereerd buiten het kader van de huidige transactie. Ze worden verbruikt of de transactie met behulp van het volgnummer wordt gepleegd of teruggedraaid. Dubbele validatie vindt alleen plaats als een record volledig is ingevuld. Dit kan resulteren in sommige gevallen waarin hetzelfde nummer wordt gebruikt voor meer dan één record tijdens het maken, maar dan wordt geïdentificeerd als een duplicaat. Als dit gebeurt en andere autonumberwaarden zijn toegepast op Volgende records, kan dit resulteren in een kloof tussen autonumberwaarden en het verwachte gedrag.

cachebeheer

om de prestaties te verbeteren, wijst SQL Server vooraf het aantal volgnummers toe dat door het cacheargument wordt opgegeven.

een nieuwe reeks wordt bijvoorbeeld gemaakt met een beginwaarde van 1 en een cachegrootte van 15. Wanneer de eerste waarde nodig is, worden de waarden 1 tot en met 15 beschikbaar gesteld vanuit het geheugen. De laatste waarde in de cache (15) wordt naar de systeemtabellen op de schijf Geschreven. Wanneer alle 15 nummers worden gebruikt, zal het volgende verzoek (voor nummer 16) ervoor zorgen dat de cache opnieuw wordt toegewezen. De nieuwe laatste waarde in de cache (30) wordt naar de systeemtabellen geschreven.

als de Database-Engine wordt gestopt nadat u 22 nummers hebt gebruikt, wordt het volgende beoogde volgnummer in het geheugen (23) naar de systeemtabellen geschreven, ter vervanging van het eerder opgeslagen nummer.

nadat SQL Server opnieuw is opgestart en er een volgnummer nodig is, wordt het startnummer gelezen uit de systeemtabellen (23). Het cachebedrag van 15 nummers (23-38) wordt toegewezen aan het geheugen en het volgende niet-cachenummer (39) wordt naar de systeemtabellen geschreven.

als de Database-Engine abnormaal stopt voor een gebeurtenis zoals een stroomstoring, wordt de reeks opnieuw gestart met het nummer uit systeemtabellen (39). Alle volgnummers die aan het geheugen zijn toegewezen (maar nooit door een gebruiker of toepassing zijn aangevraagd) gaan verloren. Deze functionaliteit kan gaten achterlaten, maar garandeert dat dezelfde waarde nooit twee keer wordt uitgegeven voor een object met een enkele reeks, tenzij het is gedefinieerd als cyclus of handmatig wordt herstart.

de cache wordt bewaard in het geheugen door het bijhouden van de huidige waarde (de laatste waarde die is uitgegeven) en het aantal resterende waarden in de cache. Daarom is de hoeveelheid geheugen die door de cache wordt gebruikt altijd twee exemplaren van het gegevenstype van het sequentieobject.

Het cacheargument instellen op geen CACHE schrijft de huidige waarde naar de systeemtabellen elke keer dat een reeks wordt gebruikt. Dit kan de prestaties vertragen door de schijftoegang te verhogen, maar vermindert de kans op onbedoelde gaten. Hiaten kunnen nog steeds optreden als getallen worden gevraagd met behulp van de volgende waarde voor of sp_sequence_get_range functies, maar dan worden de getallen ofwel niet gebruikt of worden gebruikt in niet-gecommitteerde transacties.

wanneer een sequence object de CACHE optie gebruikt, als u het sequence object herstart, of de eigenschappen INCREMENT, CYCLE, MINVALUE, MAXVALUE of de cachegrootte wijzigt, zal de cache naar de systeemtabellen worden geschreven voordat de verandering plaatsvindt. Vervolgens wordt de cache opnieuw geladen vanaf de huidige waarde (dus geen nummers worden overgeslagen). Het wijzigen van de cachegrootte wordt onmiddellijk van kracht.

CACHE-optie als cachewaarden beschikbaar zijn

het volgende proces vindt plaats telkens wanneer een sequence-object wordt gevraagd om de volgende waarde voor de CACHE-optie te genereren als er ongebruikte waarden beschikbaar zijn in de in-memory-cache voor het sequence-object.

  1. de volgende waarde voor het sequence-object wordt berekend.

  2. de nieuwe huidige waarde voor het sequence-object wordt bijgewerkt in het geheugen.

  3. de berekende waarde wordt teruggegeven aan het aanroepende statement.

CACHE-optie wanneer de cache is uitgeput

het volgende proces vindt plaats telkens wanneer een sequentieobject wordt gevraagd om de volgende waarde voor de CACHE-optie te genereren als de cache is uitgeput:

  1. de volgende waarde voor het sequentieobject wordt berekend.

  2. de laatste waarde voor de nieuwe cache wordt berekend.

  3. de systeemtabel rij voor het sequence object is vergrendeld, en de waarde berekend in Stap 2 (de laatste waarde) wordt naar de systeemtabel geschreven. Een cache-uitgeput xevent wordt afgevuurd om de gebruiker op de hoogte van de nieuwe persisted waarde.

geen CACHE-optie

het volgende proces vindt plaats telkens wanneer een sequentieobject wordt gevraagd om de volgende waarde voor de optie geen CACHE te genereren:

  1. de volgende waarde voor het sequentieobject wordt berekend.

  2. De Nieuwe huidige waarde voor het sequence-object wordt naar de systeemtabel geschreven.

  3. de berekende waarde wordt teruggegeven aan het aanroepende statement.

metagegevens

voor informatie over sequenties, zoek sys.videosequenties.

beveiliging

Machtigingen

vereist create SEQUENCE, ALTER, or CONTROL permissions op het SCHEMA.

  • leden van de vaste databaserollen db_owner en db_ddladmin kunnen objecten maken, wijzigen en neerzetten.

  • leden van de vaste databaserollen db_owner en db_datawriter kunnen sequentieobjecten bijwerken door ze getallen te laten genereren.

het volgende voorbeeld geeft de gebruiker AdventureWorks \ Larry toestemming om sequenties te maken in het testschema.

GRANT CREATE SEQUENCE ON SCHEMA::Test TO 

eigendom van een sequentieobject kan worden overgedragen met behulp van de Alter AUTHORIZATION statement.

als een reeks een door de gebruiker gedefinieerd gegevenstype gebruikt, moet de maker van de reeks referenties hebben voor het type.

Audit

controleer de SCHEMA_OBJECT_CHANGE_GROUP om een reeks aan te maken te controleren.

voorbeelden

voor voorbeelden van het maken van reeksen en het gebruik van de volgende waarde voor de functie om volgnummers te genereren, zie volgnummers.

De meeste van de volgende voorbeelden maken sequentieobjecten in een schema met de naam Test.

voer het volgende commando uit om het testschema te maken.

CREATE SCHEMA Test ; GO 

A. Een reeks maken die met 1 toeneemt

in het volgende voorbeeld maakt Thierry een reeks met de naam CountBy1 die met 1 toeneemt elke keer dat deze wordt gebruikt.

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

B. Het creëren van een reeks die afneemt met 1

het volgende voorbeeld begint bij 0 en telt in negatieve getallen met een elke keer dat het wordt gebruikt.

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

C. Een reeks maken die met 5

toeneemt het volgende voorbeeld maakt een reeks aan die met 5 toeneemt elke keer dat deze wordt gebruikt.

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

D. een reeks aanmaken die begint met een aangewezen nummer

na het importeren van een tabel, merkt Thierry op dat het hoogste gebruikte ID-nummer 24.328 is. Thierry heeft een reeks nodig die getallen genereert vanaf 24.329. De volgende code creëert een reeks die begint met 24.329 en stappen met 1.

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

E. Een reeks maken met standaardwaarden

het volgende voorbeeld maakt een reeks met de standaardwaarden.

CREATE SEQUENCE Test.TestSequence ; 

Voer de volgende instructie uit om de eigenschappen van de reeks te bekijken.

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

een gedeeltelijke lijst van de uitvoer toont de standaardwaarden.

current_value

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

F. Een reeks aanmaken met een specifiek gegevenstype

het volgende voorbeeld maakt een reeks aan met het smallint gegevenstype, met een bereik van -32.768 tot 32.767.

CREATE SEQUENCE SmallSeq AS smallint ; 

G. een reeks maken met alle argumenten

het volgende voorbeeld maakt een reeks met de naam DecSeq met behulp van het decimale gegevenstype, met een bereik van 0 tot 255. De volgorde begint met 125 en elke keer dat er een getal wordt gegenereerd, neemt het aantal toe met 25. Omdat de reeks is geconfigureerd om te fietsen wanneer de waarde de maximale waarde van 200 overschrijdt, start de reeks opnieuw op met de minimale waarde van 100.

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

voer het volgende statement uit om de eerste waarde te zien; de START WITH optie van 125.

SELECT NEXT VALUE FOR Test.DecSeq; 

voer het statement nog drie keer uit om 150, 175 en 200 terug te geven.

voer het statement opnieuw uit om te zien hoe de startwaarde terugkeert naar de MINVALUE optie van 100.

Voer de volgende code uit om de cachegrootte te bevestigen en de huidige waarde te zien.

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

zie ook

alter SEQUENCE (Transact-SQL)
DROP SEQUENCE (Transact-SQL)
NEXT VALUE FOR (Transact-SQL)
Sequence Numbers

Geef een antwoord

Het e-mailadres wordt niet gepubliceerd.