NEXT VALUE FOR (Transact-SQL)NEXT VALUE FOR (Transact-SQL)

QUESTO ARGOMENTO SI APPLICA A:sìSQL Server (a partire dalla versione 2012)sìDatabase SQL di AzurenoAzure SQL Data Warehouse noParallel Data Warehouse THIS TOPIC APPLIES TO:yesSQL Server (starting with 2012)yesAzure SQL DatabasenoAzure SQL Data Warehouse noParallel Data Warehouse

Genera un numero di sequenza dall'oggetto sequenza specificato.Generates a sequence number from the specified sequence object.

Per una descrizione completa della creazione e utilizzo delle sequenze, vedere numeri di sequenza.For a complete discussion of both creating and using sequences, see Sequence Numbers. Utilizzare sp_sequence_get_range per generare un intervallo di numeri di sequenza.Use sp_sequence_get_range to generate reserve a range of sequence numbers.

Icona di collegamento a un argomentoConvenzioni della sintassi Transact-SQLTopic link icon Transact-SQL Syntax Conventions

SintassiSyntax


NEXT VALUE FOR [ database_name . ] [ schema_name . ]  sequence_name  
   [ OVER (<over_order_by_clause>) ]  

ArgomentiArguments

database_namedatabase_name
Nome del database contenente l'oggetto sequenza.The name of the database that contains the sequence object.

schema_nameschema_name
Nome dello schema contenente l'oggetto sequenza.The name of the schema that contains the sequence object.

sequence_namesequence_name
Nome dell'oggetto sequenza che genera il numero.The name of the sequence object that generates the number.

over_order_by_clauseover_order_by_clause
Determina l'ordine in cui il valore della sequenza viene assegnato alle righe in una partizione.Determines the order in which the sequence value is assigned to the rows in a partition. Per ulteriori informazioni, vedere la clausola OVER ( Transact-SQL ) .For more information, see OVER Clause (Transact-SQL).

Tipi restituitiReturn Types

Restituisce un numero utilizzando il tipo della sequenza.Returns a number using the type of the sequence.

OsservazioniRemarks

Il NEXT VALUE FOR funzione può essere utilizzata in stored procedure e trigger.The NEXT VALUE FOR function can be used in stored procedures and triggers.

Quando il NEXT VALUE FOR funzione viene utilizzata in un vincolo predefinito o di query, se lo stesso oggetto sequenza viene utilizzato più di una volta o se lo stesso oggetto sequenza viene utilizzato nell'istruzione che fornisce i valori e in un vincolo predefinito l'esecuzione, verrà restituito lo stesso valore per tutte le colonne che fanno riferimento alla stessa sequenza all'interno di una riga nel set di risultati.When the NEXT VALUE FOR function is used in a query or default constraint, if the same sequence object is used more than once, or if the same sequence object is used both in the statement supplying the values, and in a default constraint being executed, the same value will be returned for all columns referencing the same sequence within a row in the result set.

Il NEXT VALUE FOR funzione è non deterministica ed è consentita solo in contesti in cui il numero di valori di sequenza generati è ben definito.The NEXT VALUE FOR function is nondeterministic, and is only allowed in contexts where the number of generated sequence values is well defined. Di seguito è riportata la definizione del numero di valori che verranno utilizzati per ogni oggetto sequenza a cui viene fatto riferimento in una determinata istruzione:Below is the definition of how many values will be used for each referenced sequence object in a given statement:

  • Selezionare -per ogni oggetto sequenza a cui fa riferimento, un nuovo valore viene generato una volta per ogni riga nel risultato dell'istruzione.SELECT - For each referenced sequence object, a new value is generated once per row in the result of the statement.

  • INSERIRE ...INSERT I valori -per ogni oggetto sequenza a cui fa riferimento, un nuovo valore viene generato una volta per ogni riga inserita nell'istruzione.VALUES - For each referenced sequence object, a new value is generated once for each inserted row in the statement.

  • AGGIORNAMENTO -per ogni oggetto sequenza a cui fa riferimento, viene generato un nuovo valore per ogni riga aggiornata dall'istruzione.UPDATE - For each referenced sequence object, a new value is generated for each row being updated by the statement.

  • Istruzioni procedurali (ad esempio DECLARE, impostaree così via), per ogni oggetto sequenza a cui fa riferimento, viene generato un nuovo valore per ogni istruzione.Procedural statements (such as DECLARE, SET, etc.) - For each referenced sequence object, a new value is generated for each statement.

Limitazioni e restrizioniLimitations and Restrictions

Il NEXT VALUE FOR funzione non può essere utilizzata nelle situazioni seguenti:The NEXT VALUE FOR function cannot be used in the following situations:

  • Il database è in modalità sola lettura.When a database is in read-only mode.

  • Come argomento per una funzione con valori di tabella.As an argument to a table-valued function.

  • Come argomento per una funzione di aggregazione.As an argument to an aggregate function.

  • Nelle sottoquery che includono espressioni di tabella comuni e tabelle derivate.In subqueries including common table expressions and derived tables.

  • Nelle viste, nelle funzioni definite dall'utente o nelle colonne calcolate.In views, in user-defined functions, or in computed columns.

  • In un'istruzione che usa il DISTINCT, unione, UNION ALL, EXCEPT o INTERSECT operatore.In a statement using the DISTINCT, UNION, UNION ALL, EXCEPT or INTERSECT operator.

  • In un'istruzione che usa il ORDER BY clausola a meno che non NEXT VALUE FOR ...In a statement using the ORDER BY clause unless NEXT VALUE FOR SU (ORDER BY ...) viene utilizzato.OVER (ORDER BY …) is used.

  • Nelle clausole seguenti: recuperare, su, OUTPUT, ON, PIVOT, La trasformazione UNPIVOT, RAGGRUPPARE, HAVING, calcolo, COMPUTE BY, o diFORXML.In the following clauses: FETCH, OVER, OUTPUT, ON, PIVOT, UNPIVOT, GROUP BY, HAVING, COMPUTE, COMPUTE BY, or FOR XML.

  • In espressioni condizionali utilizzando CASE, scegliere, COALESCE, IIF, ISNULL, o NULLIF.In conditional expressions using CASE, CHOOSE, COALESCE, IIF, ISNULL, or NULLIF.

  • In un valori clausola che non fa parte di un inserire istruzione.In a VALUES clause that is not part of an INSERT statement.

  • Nella definizione di un vincolo CHECK.In the definition of a check constraint.

  • Nella definizione di un oggetto predefinito o di una regola.In the definition of a rule or default object. Può essere utilizzata in un vincolo predefinito.(It can be used in a default constraint.)

  • Come valore predefinito in un tipo di tabella definito dall'utente.As a default in a user-defined table type.

  • In un'istruzione che usa TOP, OFFSET, o quando il ROWCOUNT opzione è impostata.In a statement using TOP, OFFSET, or when the ROWCOUNT option is set.

  • Nel dove clausola di un'istruzione.In the WHERE clause of a statement.

  • In un MERGE istruzione.In a MERGE statement. (Tranne quando la NEXT VALUE FOR funzione viene utilizzata in un vincolo predefinito nella tabella di destinazione e l'impostazione predefinita viene utilizzata per la crea istruzione del MERGE istruzione.)(Except when the NEXT VALUE FOR function is used in a default constraint in the target table and default is used in the CREATE statement of the MERGE statement.)

Utilizzo di un oggetto sequenza in un vincolo predefinitoUsing a Sequence Object in a Default Constraint

Quando si utilizza il NEXT VALUE FOR funzione in un vincolo predefinito, applicano le regole seguenti:When using the NEXT VALUE FOR function in a default constraint, the following rules apply:

  • È possibile fare riferimento a un singolo oggetto sequenza dai vincoli predefiniti in più tabelle.A single sequence object may be referenced from default constraints in multiple tables.

  • La tabella e l'oggetto sequenza devono risiedere nello stesso database.The table and the sequence object must reside in the same database.

  • L'utente che aggiunge il vincolo predefinito deve disporre dell'autorizzazione REFERENCES per l'oggetto sequenza.The user adding the default constraint must have REFERENCES permission on the sequence object.

  • Non è possibile eliminare un oggetto sequenza a cui viene fatto riferimento da un vincolo predefinito prima che venga eliminato il vincolo predefinito.A sequence object that is referenced from a default constraint cannot be dropped before the default constraint is dropped.

  • Lo stesso numero di sequenza viene restituito per tutte le colonne di una riga se più vincoli predefiniti utilizzano lo stesso oggetto sequenza o se lo stesso oggetto sequenza viene utilizzato sia nell'istruzione che fornisce i valori, sia in un vincolo predefinito di cui è in corso l'esecuzione.The same sequence number is returned for all columns in a row if multiple default constraints use the same sequence object, or if the same sequence object is used both in the statement supplying the values, and in a default constraint being executed.

  • I riferimenti al NEXT VALUE FOR funzione in un vincolo predefinito non è possibile specificare il su clausola.References to the NEXT VALUE FOR function in a default constraint cannot specify the OVER clause.

  • È possibile modificare un oggetto sequenza a cui viene fatto riferimento in un vincolo predefinito.A sequence object that is referenced in a default constraint can be altered.

  • In caso di un INSERT … SELECT o INSERT … EXEC istruzione in cui i dati inseriti provengono da una query tramite un ORDER BY clausola, i valori restituiti dal NEXT VALUE FOR sarà (funzione) generati nell'ordine specificato da di ORDER BY clausola.In the case of an INSERT … SELECT or INSERT … EXEC statement where the data being inserted comes from a query using an ORDER BY clause, the values being returned by the NEXT VALUE FOR function will be generated in the order specified by the ORDER BY clause.

Utilizzo di un oggetto sequenza con una clausola OVER ORDER BYUsing a Sequence Object with an OVER ORDER BY Clause

Il NEXT VALUE FOR funzione supporta la generazione di valori di sequenza ordinati applicando la su clausola per la NEXT VALUE FOR chiamare.The NEXT VALUE FOR function supports generating sorted sequence values by applying the OVER clause to the NEXT VALUE FOR call. Tramite il su clausola, un utente si garantisce che i valori restituiti vengono generati nell'ordine del su della clausola ordine Bsottoclausola Y.By using the OVER clause, a user is guaranteed that the values being returned are generated in the order of the OVER clause's ORDER BY subclause. Le regole aggiuntive seguenti si applicano quando si utilizza il NEXT VALUE FOR utilizzabile con il su clausola:The following additional rules apply when using the NEXT VALUE FOR function with the OVER clause:

  • Più chiamate al metodo di NEXT VALUE FOR funzionerà per lo stesso generatore di sequenza in una singola istruzione deve tutte utilizzare la stessa su definizione della clausola.Multiple calls to the NEXT VALUE FOR function for the same sequence generator in a single statement must all use the same OVER clause definition.

  • Più chiamate al metodo di NEXT VALUE FOR funzione che riferimento generatori di sequenza diversi in una singola istruzione possono avere diversi su definizioni della clausola.Multiple calls to the NEXT VALUE FOR function that reference different sequence generators in a single statement can have different OVER clause definitions.

  • Un su clausola applicata al NEXT VALUE FOR funzione non supporta il PARTITION BY clausola sub.An OVER clause applied to the NEXT VALUE FOR function does not support the PARTITION BY sub clause.

  • Se tutte le chiamate per il NEXT VALUE FOR funzionare in un selezionare istruzione specifica il su clausola, un ORDER BY clausola può essere utilizzata in il selezionare istruzione.If all calls to the NEXT VALUE FOR function in a SELECT statement specifies the OVER clause, an ORDER BY clause may be used in the SELECT statement.

  • Il su clausola è consentita con la NEXT VALUE FOR funzionano se utilizzati in un selezionare istruzione o INSERT … SELECT … istruzione.The OVER clause is allowed with the NEXT VALUE FOR function when used in a SELECT statement or INSERT … SELECT … statement. Utilizzare il su clausola con il NEXT VALUE FOR funzione non è consentita aggiornamento o MERGE istruzioni.Use of the OVER clause with the NEXT VALUE FOR function is not allowed in UPDATE or MERGE statements.

  • Se un altro processo accede contemporaneamente all'oggetto sequenza, i numeri restituiti potrebbero presentare vuoti.If another process is accessing the sequence object at the same time, the numbers returned could have gaps.

MetadatiMetadata

Per informazioni sulle sequenze, eseguire una query di Sequences vista del catalogo.For information about sequences, query the sys.sequences catalog view.

SecuritySecurity

PermissionsPermissions

Richiede aggiornamento l'autorizzazione per l'oggetto sequenza o lo schema della sequenza.Requires UPDATE permission on the sequence object or the schema of the sequence. Per un esempio relativo alla concessione di autorizzazioni, vedere l'esempio F più avanti in questo argomento.For an example of granting permission, see example F later in this topic.

Concatenamento della proprietàOwnership Chaining

Gli oggetti sequenza supportano il concatenamento della proprietà.Sequence objects support ownership chaining. Se l'oggetto sequenza appartiene allo stesso proprietario della tabella, del trigger o della stored procedure chiamante (con oggetto sequenza come vincolo predefinito), non è necessario effettuare alcuna verifica delle autorizzazioni per l'oggetto sequenza.If the sequence object has the same owner as the calling stored procedure, trigger, or table (having a sequence object as a default constraint), no permission check is required on the sequence object. Se l'oggetto sequenza non appartiene allo stesso utente della tabella, del trigger o della stored procedure chiamante, è necessario effettuare la verifica delle autorizzazioni per l'oggetto sequenza.If the sequence object is not owned by the same user as the calling stored procedure, trigger, or table, a permission check is required on the sequence object.

Quando il NEXT VALUE FOR funzione viene utilizzata come valore predefinito in una tabella, gli utenti richiedono sia inserire autorizzazione per la tabella, e aggiornamento autorizzazione per l'oggetto sequenza , per inserire dati utilizzando il valore predefinito.When the NEXT VALUE FOR function is used as a default value in a table, users require both INSERT permission on the table, and UPDATE permission on the sequence object, to insert data using the default.

  • Se il vincolo predefinito appartiene allo stesso proprietario dell'oggetto sequenza, non sono necessarie autorizzazioni per l'oggetto sequenza quando viene chiamato il vincolo predefinito.If the default constraint has the same owner as the sequence object, no permissions are required on the sequence object when the default constraint is called.

  • Se il vincolo predefinito e l'oggetto sequenza non appartengono allo stesso utente, sono necessarie autorizzazioni per l'oggetto sequenza anche se viene chiamato attraverso il vincolo predefinito.If the default constraint and the sequence object are not owned by the same user, permissions are required on the sequence object even if it is called through the default constraint.

ControlloAudit

Per controllare il NEXT VALUE FOR di funzione, monitorare SCHEMA_OBJECT_ACCESS_GROUP.To audit the NEXT VALUE FOR function, monitor the SCHEMA_OBJECT_ACCESS_GROUP.

EsempiExamples

Per esempi di creazione di sequenze e utilizzando il NEXT VALUE FOR funzione per generare numeri di sequenza, vedere numeri di sequenza.For examples of both creating sequences and using the NEXT VALUE FOR function to generate sequence numbers, see Sequence Numbers.

Negli esempi seguenti viene utilizzata una sequenza denominata CountBy1 in uno schema denominato Test.The following examples use a sequence named CountBy1 in a schema named Test. Eseguire l'istruzione seguente per creare la sequenza Test.CountBy1.Execute the following statement to create the Test.CountBy1 sequence. Gli esempi C e E utilizzano il database AdventureWorks2012AdventureWorks2012, pertanto la sequenza CountBy1 viene creata in questo database.Examples C and E use the AdventureWorks2012AdventureWorks2012 database, so the CountBy1 sequence is created in that database.

USE AdventureWorks2012 ;  
GO  

CREATE SCHEMA Test;  
GO  

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

A.A. Utilizzo di una sequenza in un'istruzione SELECTUsing a sequence in a select statement

Nell'esempio seguente viene creata una sequenza denominata CountBy1 che aumenta di uno ogni volta che viene utilizzata.The following example creates a sequence named CountBy1 that increases by one every time that it is used.

SELECT NEXT VALUE FOR Test.CountBy1 AS FirstUse;  
SELECT NEXT VALUE FOR Test.CountBy1 AS SecondUse;  

Set di risultati:Here is the result set.

FirstUse  
1  

SecondUse  
2

B.B. Impostazione di una variabile sul valore di sequenza successivoSetting a variable to the next sequence value

Nell'esempio seguente vengono illustrati tre modi per impostare una variabile sul valore successivo di un numero di sequenza.The following example demonstrates three ways to set a variable to the next value of a sequence number.

DECLARE @myvar1 bigint = NEXT VALUE FOR Test.CountBy1  
DECLARE @myvar2 bigint ;  
DECLARE @myvar3 bigint ;  
SET @myvar2 = NEXT VALUE FOR Test.CountBy1 ;  
SELECT @myvar3 = NEXT VALUE FOR Test.CountBy1 ;  
SELECT @myvar1 AS myvar1, @myvar2 AS myvar2, @myvar3 AS myvar3 ;  
GO  

C.C. Utilizzo di una sequenza con una funzione finestra di rangoUsing a sequence with a ranking window function

USE AdventureWorks2012 ;  
GO  

SELECT NEXT VALUE FOR Test.CountBy1 OVER (ORDER BY LastName) AS ListNumber,  
    FirstName, LastName  
FROM Person.Contact ;  
GO  

D.D. Utilizzo della funzione NEXT VALUE FOR nella definizione di un vincolo predefinitoUsing the NEXT VALUE FOR function in the definition of a default constraint

Utilizzo di NEXT VALUE FOR funzione nella definizione di un vincolo predefinito è supportata.Using the NEXT VALUE FOR function in the definition of a default constraint is supported. Per un esempio di utilizzo NEXT VALUE FOR in un CREATE TABLE istruzione, vedere l'esempio Cnumeri di sequenza.For an example of using NEXT VALUE FOR in a CREATE TABLE statement, see Example CSequence Numbers. Nell'esempio seguente viene utilizzato ALTER TABLE per aggiungere una sequenza come impostazione predefinita a una tabella corrente.The following example uses ALTER TABLE to add a sequence as a default to a current table.

CREATE TABLE Test.MyTable  
(  
    IDColumn nvarchar(25) PRIMARY KEY,  
    name varchar(25) NOT NULL  
) ;  
GO  

CREATE SEQUENCE Test.CounterSeq  
    AS int  
    START WITH 1  
    INCREMENT BY 1 ;  
GO  

ALTER TABLE Test.MyTable  
    ADD   
        DEFAULT N'AdvWorks_' +   
        CAST(NEXT VALUE FOR Test.CounterSeq AS NVARCHAR(20))   
        FOR IDColumn;  
GO  

INSERT Test.MyTable (name)  
VALUES ('Larry') ;  
GO  

SELECT * FROM Test.MyTable;  
GO  

E.E. Utilizzo della funzione NEXT VALUE FOR in un'istruzione INSERTUsing the NEXT VALUE FOR function in an INSERT statement

Nell'esempio seguente viene creata una tabella denominata TestTable e viene utilizzata la funzione NEXT VALUE FOR per inserire una riga.The following example creates a table named TestTable and then uses the NEXT VALUE FOR function to insert a row.

CREATE TABLE Test.TestTable  
     (CounterColumn int PRIMARY KEY,  
    Name nvarchar(25) NOT NULL) ;   
GO  

INSERT Test.TestTable (CounterColumn,Name)  
    VALUES (NEXT VALUE FOR Test.CountBy1, 'Syed') ;  
GO  

SELECT * FROM Test.TestTable;   
GO  

E.E. Uso della funzione NEXT VALUE FOR con SELECT ...Using the NEXT VALUE FOR function with SELECT … INTOINTO

L'esempio seguente usa il SELECT … INTO istruzione per creare una tabella denominata Production.NewLocation e utilizza il NEXT VALUE FOR funzione per numerare ogni riga.The following example uses the SELECT … INTO statement to create a table named Production.NewLocation and uses the NEXT VALUE FOR function to number each row.

USE AdventureWorks2012 ;   
GO  

SELECT NEXT VALUE FOR Test.CountBy1 AS LocNumber, Name   
    INTO Production.NewLocation  
    FROM Production.Location ;  
GO  

SELECT * FROM Production.NewLocation ;  
GO  

F.F. Concessione dell'autorizzazione per eseguire NEXT VALUE FORGranting permission to execute NEXT VALUE FOR

Nell'esempio seguente viene concessa aggiornamento autorizzazione a un utente denominato AdventureWorks\Larry dell'autorizzazione per eseguire NEXT VALUE FOR utilizzando il Test.CounterSeq sequenza.The following example grants UPDATE permission to a user named AdventureWorks\Larry permission to execute NEXT VALUE FOR using the Test.CounterSeq sequence.

GRANT UPDATE ON OBJECT::Test.CounterSeq TO [AdventureWorks\Larry] ;  

Vedere ancheSee Also

CREATE SEQUENCE ( Transact-SQL ) CREATE SEQUENCE (Transact-SQL)
ALTER SEQUENCE ( Transact-SQL ) ALTER SEQUENCE (Transact-SQL)
Numeri di sequenzaSequence Numbers