Condividi tramite


CREA SEQUENZA (Transact-SQL)

Si applica a:SQL ServerDatabase SQL di AzureIstanza gestita di SQL di AzureDatabase SQL in Microsoft Fabric

Crea un oggetto sequenza e ne specifica le proprietà. Una sequenza è un oggetto associato a schema definito dall'utente che genera una sequenza di valori numerici in base alla specifica con la quale è stata creata la sequenza. La sequenza di valori numerici viene generata in ordine crescente o decrescente a un intervallo definito e può essere configurata per riprendere dall'inizio (ciclo) quando è esaurita.

Le sequenze, a differenza delle colonne Identity, non sono associate a tabelle specifiche. Le applicazioni fanno riferimento a un oggetto sequenza per recuperare il relativo valore successivo. La relazione tra sequenze e tabelle è controllata dall'applicazione. Le applicazioni utente possono fare riferimento a un oggetto sequenza e coordinare i valori di più righe e tabelle.

A differenza dei valori delle colonne Identity generati quando vengono inserite righe, un'applicazione può ottenere il numero di sequenza successivo senza inserire la riga chiamando NEXT VALUE FOR. Usare sp_sequence_get_range per ottenere immediatamente più numeri di sequenza.

Per informazioni e scenari che usano sia CREATE SEQUENCE che la NEXT VALUE FOR funzione , vedere Numeri di sequenza.

Convenzioni relative alla sintassi Transact-SQL

Sintassi

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 } ]
    [ ; ]

Argomenti

sequence_name

Specifica il nome univoco con il quale è nota la sequenza nel database. Il tipo è sysname.

[ built_in_integer_type | utente-defined_integer_type ]

Una sequenza può essere definita come qualsiasi tipo Integer. I tipi seguenti sono consentiti.

  • tinyint -intervallo da 0 a 255
  • smallint -intervallo tra -32.768 e 32.767
  • int - intervallo tra -2,147,483,648 e 2,147,483,647
  • bigint -intervallo tra -9.223.372.036.854.775.808 e 9.223.372.036.854.775.807
  • decimal e numeric con scala 0.
  • Qualsiasi tipo di dati definito dall'utente (tipo di alias) basato su uno dei tipi consentiti.

Se non viene specificato un tipo di dati, per impostazione predefinita viene utilizzato il tipo di dati bigint.

Costante START WITH <>

Primo valore restituito dall'oggetto sequenza. Il START valore deve essere un valore minore o uguale al valore massimo e maggiore o uguale al valore minimo dell'oggetto sequenza. Il valore iniziale predefinito per un nuovo oggetto sequenza è il valore minimo per un oggetto sequenza con ordine crescente e il valore massimo per un oggetto sequenza con ordine decrescente.

Costante INCREMENT BY <>

Valore utilizzato per incrementare (o decrementare se negativo) il valore dell'oggetto sequenza per ogni chiamata alla NEXT VALUE FOR funzione. Se l'incremento è un valore negativo, l'oggetto sequenza è decrescente; in caso contrario, è crescente. L'incremento non può essere 0. L'incremento predefinito per un nuovo oggetto sequenza è 1.

[ costante< MINVALUE >| NO MINVALUE ]

Specifica i limiti per l'oggetto sequenza. Il valore minimo predefinito per un nuovo oggetto sequenza è il valore minimo del tipo di dati dell'oggetto sequenza. Tale valore è zero per il tipo di dati tinyint e un numero negativo per tutti gli altri tipi di dati.

[ costante< MAXVALUE >| NO MAXVALUE

Specifica i limiti per l'oggetto sequenza. Il valore massimo predefinito per un nuovo oggetto sequenza è il valore massimo del tipo di dati dell'oggetto sequenza.

[ CICLO | NESSUNA BICCHIERA ]

Proprietà che specifica se l'oggetto sequenza deve riprendere dal valore minimo (o massimo per gli oggetti sequenza con ordine decrescente) o generare un'eccezione quando viene superato il relativo valore massimo o minimo. L'opzione del ciclo predefinita per i nuovi oggetti sequenza è NO CYCLE.

Nota

Il ciclo di un SEQUENCE riavvio viene eseguito dal valore minimo o massimo, non dal valore iniziale.

[ CACHE [ <costante> ] | NO CACHE ]

Migliora le prestazioni per le applicazioni che utilizzano oggetti sequenza riducendo il numero di I/O del disco necessari per generare numeri di sequenza. Il valore predefinito è CACHE.

Ad esempio, se si seleziona una dimensione della cache pari a 50, SQL Server non mantiene memorizzati nella cache 50 singoli valori. Memorizza nella cache solo il valore corrente e la quantità di valori lasciati nella cache. La quantità di memoria necessaria per l'archiviazione della cache è pertanto sempre corrispondente a due istanze del tipo di dati dell'oggetto sequenza.

Nota

Se l'opzione cache è abilitata senza specificare una dimensione della cache, il motore di database seleziona una dimensione. Tuttavia, gli utenti non devono basarsi sulla selezione coerente. Microsoft potrebbe cambiare il metodo di calcolo della dimensione della cache senza preavviso.

Quando viene creata con l'opzione CACHE , un arresto imprevisto (ad esempio un guasto di alimentazione) potrebbe comportare la perdita di numeri di sequenza rimanenti nella cache.

Osservazioni:

I numeri di sequenza vengono generati esternamente all'ambito della transazione corrente. Vengono utilizzati se viene eseguito il commit o il rollback della transazione che usa il numero di sequenza. La convalida dei duplicati viene eseguita solo quando un record è completamente popolato. Ciò può provocare, in alcuni casi, l'assegnazione di uno stesso numero a più di un record durante la creazione, ma il numero viene comunque identificato come duplicato. Se si verifica questo errore e ai record successivi sono stati applicati altri valori di numerazione automatica, può verificarsi uno scarto tra i valori di numerazione automatica e il comportamento previsto.

Gestione della cache

Per migliorare le prestazioni, SQL Server prealloca il numero di numeri di sequenza specificati dall'argomento CACHE .

Si supponga, ad esempio, che una nuova sequenza venga creata con un valore iniziale pari a 1 e una dimensione della cache pari a 15. Quando viene richiesto il primo valore, i valori compresi tra 1 e 15 vengono resi disponibili dalla memoria. L'ultimo valore memorizzato nella cache (15) viene scritto nelle tabelle di sistema sul disco. Dopo che tutti e 15 i numeri sono stati utilizzati, la richiesta successiva (del numero 16) comporterà la riallocazione della cache. Il nuovo valore memorizzato nella cache (30) viene scritto nelle tabelle di sistema.

Se il motore di database viene arrestato dopo che sono stati usati 22 numeri, il numero di sequenza desiderato successivo in memoria (23) viene scritto nelle tabelle di sistema, andando a sostituire il numero archiviato in precedenza.

Quando SQL Server viene riavviato e viene richiesto un numero di sequenza, il numero iniziale viene letto dalle tabelle di sistema (23). La quantità della cache di 15 numeri (23-38) viene allocata nella memoria e il numero non memorizzato nella cache successivo (39) viene scritto nelle tabelle di sistema.

Se il motore di database viene arrestato in modo anomalo per un evento quale un'interruzione dell'alimentazione, la sequenza viene riavviata con il numero letto dalle tabelle di sistema (39). Qualsiasi numero di sequenza allocato nella memoria (ma mai richiesto da un utente o da un'applicazione) va perso. Questa funzionalità potrebbe lasciare spazi vuoti, ma garantisce che lo stesso valore non venga mai rilasciato due volte per un singolo oggetto sequenza, a meno che non sia definito come CYCLE o venga riavviato manualmente.

La cache viene mantenuta in memoria monitorando il valore corrente (l'ultimo valore emesso) e la quantità di valori lasciati nella cache. Pertanto, la quantità di memoria utilizzata dalla cache è sempre corrispondente a due istanze del tipo di dati dell'oggetto sequenza.

L'impostazione dell'argomento cache per NO CACHE scrivere il valore della sequenza corrente nelle tabelle di sistema ogni volta che viene usata una sequenza. Le prestazioni potrebbero diminuire in seguito all'aumento dell'accesso al disco, tuttavia diminuiscono anche le probabilità di vuoti indesiderati. Le lacune possono verificarsi ancora se i numeri vengono richiesti usando le NEXT VALUE FOR funzioni o sp_sequence_get_range , ma i numeri non vengono usati o vengono usati nelle transazioni di cui non è stato eseguito il commit.

Quando un oggetto sequenza usa l'opzione CACHE , se si riavvia l'oggetto sequenza o si modificano le INCREMENTproprietà , CYCLEMINVALUE, MAXVALUE, o le dimensioni della cache, la cache verrà scritta nelle tabelle di sistema prima che si verifichi la modifica. La cache viene quindi ricaricata a partire dal valore corrente, ovvero senza numeri ignorati. La modifica della dimensione della cache diventa effettiva immediatamente.

Opzione CACHE quando sono disponibili valori memorizzati nella cache

Il processo seguente si verifica ogni volta che viene richiesto a un oggetto sequenza di generare il valore successivo per l'opzione CACHE se sono disponibili valori inutilizzati nella cache in memoria per l'oggetto sequenza.

  1. Viene calcolato il valore successivo per l'oggetto sequenza.
  2. Viene aggiornato in memoria il nuovo valore corrente per l'oggetto sequenza.
  3. Il valore calcolato viene restituito all'istruzione di chiamata.

Opzione CACHE quando la cache è esaurita

Il processo seguente si verifica ogni volta che viene richiesto a un oggetto sequenza di generare il valore successivo per l'opzione CACHE se la cache è esaurita:

  1. Viene calcolato il valore successivo per l'oggetto sequenza.

  2. Viene calcolato l'ultimo valore per la nuova cache.

  3. Viene bloccata la riga della tabella di sistema per l'oggetto sequenza e il valore calcolato nel passaggio 2 (l'ultimo valore) viene scritto nella tabella di sistema. Viene generato un evento esteso con esaurimento della cache per notificare all'utente il nuovo valore persistente.

Nessuna opzione CACHE

Il processo seguente si verifica ogni volta che viene richiesto a un oggetto sequenza di generare il valore successivo per l'opzione NO CACHE :

  1. Viene calcolato il valore successivo per l'oggetto sequenza.
  2. Il nuovo valore corrente per l'oggetto sequenza viene scritto nella tabella di sistema.
  3. Il valore calcolato viene restituito all'istruzione di chiamata.

Metadati UFX

Per informazioni sulle sequenze, eseguire una query su sys.sequences.

Sicurezza

Autorizzazioni

Richiede CREATE SEQUENCEl'autorizzazione , ALTERo CONTROL per .SCHEMA

  • I membri del db_owner e db_ddladmin ruoli predefiniti del database possono creare, modificare ed eliminare oggetti sequenza.
  • I membri del db_owner e db_datawriter ruoli predefiniti del database possono aggiornare gli oggetti sequenza causando la generazione di numeri.

Nell'esempio seguente viene concessa all'utente l'autorizzazione AdventureWorks\Larry per creare sequenze nello Test schema.

GRANT CREATE SEQUENCE
    ON SCHEMA::Test TO [AdventureWorks\Larry];

La proprietà di un oggetto sequenza può essere trasferita tramite l'istruzione ALTER AUTHORIZATION .

Se una sequenza usa un tipo di dati definito dall'utente, l'autore della sequenza deve disporre REFERENCES dell'autorizzazione per il tipo.

Controllo

Per controllare CREATE SEQUENCE, monitorare .SCHEMA_OBJECT_CHANGE_GROUP

Esempi

Per esempi di creazione di sequenze e uso della NEXT VALUE FOR funzione per generare numeri di sequenza, vedere Numeri di sequenza.

La maggior parte degli esempi seguenti riguarda la creazione di oggetti sequenza in un schema denominato test.

Per creare lo schema test, eseguire l'istruzione seguente.

CREATE SCHEMA Test;
GO

R. Creare una sequenza che aumenta di 1

Nell'esempio seguente Viene creata una sequenza denominata CountBy1 che aumenta di una ogni volta che viene usata.

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

B. Creare una sequenza che diminuisce di 1

L'esempio seguente inizia da 0 e conta in numeri negativi di uno ogni volta che viene usato.

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

C. Creare una sequenza che aumenta di 5

Nell'esempio seguente viene creata una sequenza che aumenta di 5 ogni volta che viene usata.

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

D. Creare una sequenza che inizia con un numero designato

Dopo avere importato una tabella, Thierry nota che il numero ID più elevato utilizzato è 24.328. La Sequenza richiede una sequenza che genera numeri a partire da 24.329. Nel codice seguente viene creata una sequenza che inizia da 24.329 e aumenta di 1.

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

E. Creare una sequenza usando i valori predefiniti

Nell'esempio seguente viene creata una sequenza utilizzando i valori predefiniti.

CREATE SEQUENCE Test.TestSequence;

Eseguire l'istruzione seguente per visualizzare le proprietà della sequenza.

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

Un elenco parziale dell'output dimostra i valori predefiniti.

Output Valore predefinito
start_value -9223372036854775808
increment 1
minimum_value -9223372036854775808
maximum_value 9223372036854775807
is_cycling 0
is_cached 1
current_value -9223372036854775808

F. Creare una sequenza con un tipo di dati specifico

Nell'esempio seguente viene creata una sequenza utilizzando il tipo di dati smallint, con un intervallo compreso tra -32.768 e 32.767.

CREATE SEQUENCE SmallSeq
    AS SMALLINT;

G. Creare una sequenza usando tutti gli argomenti

Nell'esempio seguente viene creata una sequenza denominata DecSeq utilizzando il tipo di dati decimale, con un intervallo compreso tra 0 e 255. La sequenza inizia con 125 e aumenta di 25 ogni volta che viene generato un numero. Poiché la sequenza è configurata per riprendere quando il valore supera il valore massimo di 200, la sequenza riprende dal valore minimo di 100.

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

Eseguire l'istruzione seguente per visualizzare il primo valore; l'opzione START WITH di 125.

SELECT  NEXT VALUE FOR Test.DecSeq;

Eseguire l'istruzione altre tre volte affinché vengano restituiti i numeri 150, 175 e 200.

Eseguire nuovamente l'istruzione per vedere come il valore iniziale torna nuovamente all'opzione MINVALUE con valore 100.

Eseguire il codice seguente per confermare la dimensione della cache e vedere il valore corrente.

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