NILAI BERIKUTNYA UNTUK (Transact-SQL)

Berlaku untuk:SQL ServerAzure SQL DatabaseAzure SQL Managed Instance

Menghasilkan nomor urut dari objek urutan yang ditentukan.

Untuk diskusi lengkap tentang membuat dan menggunakan urutan, lihat Nomor Urutan. Gunakan sp_sequence_get_range untuk menghasilkan rentang nomor urut.

Konvensi sintaks transact-SQL

Sintaksis

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

Catatan

Untuk melihat sintaks Transact-SQL untuk SQL Server 2014 (12.x) dan versi yang lebih lama, lihat Dokumentasi versi sebelumnya.

Argumen

database_name
Nama database yang berisi objek urutan.

schema_name
Nama skema yang berisi objek urutan.

sequence_name
Nama objek urutan yang menghasilkan angka.

over_order_by_clause
Menentukan urutan di mana nilai urutan ditetapkan ke baris dalam partisi. Untuk informasi selengkapnya, lihat Klausul OVER (Transact-SQL).

Jenis Kembalian

Mengembalikan angka menggunakan jenis urutan.

Keterangan

Fungsi NEXT VALUE FOR dapat digunakan dalam prosedur dan pemicu tersimpan.

Ketika fungsi NEXT VALUE FOR digunakan dalam kueri atau batasan default, jika objek urutan yang sama digunakan lebih dari sekali, atau jika objek urutan yang sama digunakan baik dalam pernyataan yang menyediakan nilai, dan dalam batasan default yang dijalankan, nilai yang sama akan dikembalikan untuk semua kolom yang mereferensikan urutan yang sama dalam baris dalam tataan hasil.

Fungsi NEXT VALUE FOR bersifat nondeterministik, dan hanya diperbolehkan dalam konteks di mana jumlah nilai urutan yang dihasilkan didefinisikan dengan baik. Di bawah ini adalah definisi berapa banyak nilai yang akan digunakan untuk setiap objek urutan yang direferensikan dalam pernyataan tertentu:

  • SELECT - Untuk setiap objek urutan yang direferensikan, nilai baru dihasilkan sekali per baris dalam hasil pernyataan.

  • SISIPKAN ... VALUES - Untuk setiap objek urutan yang direferensikan, nilai baru dihasilkan sekali untuk setiap baris yang disisipkan dalam pernyataan.

  • UPDATE - Untuk setiap objek urutan yang direferensikan, nilai baru dihasilkan untuk setiap baris yang diperbarui oleh pernyataan.

  • Pernyataan prosedural (seperti DECLARE, SET, dll.) - Untuk setiap objek urutan yang direferensikan, nilai baru dihasilkan untuk setiap pernyataan.

Batasan dan Pembatasan

Fungsi NEXT VALUE FOR tidak dapat digunakan dalam situasi berikut:

  • Saat database dalam mode baca-saja.

  • Sebagai argumen untuk fungsi bernilai tabel.

  • Sebagai argumen untuk fungsi agregat.

  • Dalam subkueri termasuk ekspresi tabel umum dan tabel turunan.

  • Dalam tampilan, dalam fungsi yang ditentukan pengguna, atau di kolom komputasi.

  • Dalam pernyataan menggunakan operator DISTINCT, UNION, UNION ALL, EXCEPT , atau INTERSECT .

  • Dalam pernyataan menggunakan klausa ORDER BY kecuali NEXT VALUE FOR ... OVER (ORDER BY ...) digunakan.

  • Dalam klausul berikut: FETCH, OVER, OUTPUT, ON, PIVOT, UNPIVOT, GROUP BY, HAVING, COMPUTE, COMPUTE BY, atau FOR XML.

  • Dalam ekspresi kondisional menggunakan CASE, CHOOSE, COALESCE, IIF, ISNULL, atau NULLIF.

  • Dalam klausa VALUES yang bukan bagian dari pernyataan INSERT.

  • Dalam definisi batasan pemeriksaan.

  • Dalam definisi aturan atau objek default. (Ini dapat digunakan dalam batasan default.)

  • Sebagai default dalam jenis tabel yang ditentukan pengguna.

  • Dalam pernyataan menggunakan TOP, OFFSET, atau saat opsi ROWCOUNT diatur.

  • Dalam klausul WHERE dari pernyataan.

  • Dalam pernyataan MERGE. (Kecuali ketika Fungsi NEXT VALUE FOR digunakan dalam batasan default dalam tabel target dan default digunakan dalam pernyataan CREATE dari pernyataan MERGE .)

Menggunakan Objek Urutan dalam Batasan Default

Saat menggunakan fungsi NEXT VALUE FOR dalam batasan default, aturan berikut berlaku:

  • Objek urutan tunggal dapat direferensikan dari batasan default dalam beberapa tabel.

  • Tabel dan objek urutan harus berada di database yang sama.

  • Pengguna yang menambahkan batasan default harus memiliki izin REFERENSI pada objek urutan.

  • Objek urutan yang direferensikan dari batasan default tidak dapat dihilangkan sebelum batasan default dihilangkan.

  • Angka urutan yang sama dikembalikan untuk semua kolom dalam baris jika beberapa batasan default menggunakan objek urutan yang sama, atau jika objek urutan yang sama digunakan baik dalam pernyataan yang menyediakan nilai, dan dalam batasan default yang dijalankan.

  • Referensi ke fungsi NEXT VALUE FOR dalam batasan default tidak dapat menentukan klausa OVER .

  • Objek urutan yang direferensikan dalam batasan default dapat diubah.

  • Dalam kasus INSERT ... SELECT pernyataan atau INSERT ... EXEC di mana data yang disisipkan berasal dari kueri menggunakan klausa ORDER BY , nilai yang dikembalikan oleh fungsi NEXT VALUE FOR akan dihasilkan dalam urutan yang ditentukan oleh klausa ORDER BY .

Menggunakan Objek Urutan dengan Klausul OVER ORDER BY

Fungsi NEXT VALUE FOR mendukung pembuatan nilai urutan yang diurutkan dengan menerapkan klausa OVER ke NILAI BERIKUTNYA UNTUK panggilan. Dengan menggunakan klausul OVER, pengguna dijamin bahwa nilai yang dikembalikan dihasilkan dalam urutan subklasul ORDER BY klausul OVER. Aturan tambahan berikut berlaku saat menggunakan fungsi NEXT VALUE FOR dengan klausa OVER :

  • Beberapa panggilan ke fungsi NEXT VALUE FOR untuk generator urutan yang sama dalam satu pernyataan semuanya harus menggunakan definisi klausa OVER yang sama.

  • Beberapa panggilan ke fungsi NEXT VALUE FOR yang mereferensikan generator urutan yang berbeda dalam satu pernyataan dapat memiliki definisi klausa OVER yang berbeda.

  • Klausa OVER yang diterapkan ke fungsi NEXT VALUE FOR tidak mendukung sub klausa PARTITION BY.

  • Jika semua panggilan ke fungsi NEXT VALUE FOR dalam pernyataan SELECT menentukan klausa OVER, klausa ORDER BY dapat digunakan dalam pernyataan SELECT.

  • Klausa OVER diizinkan dengan fungsi NEXT VALUE FOR saat digunakan dalam pernyataan atau INSERT ... SELECT ... pernyataan SELECT. Penggunaan klausa OVER dengan fungsi NEXT VALUE FOR tidak diizinkan dalam pernyataan UPDATE atau MERGE .

  • Jika proses lain mengakses objek urutan secara bersamaan, angka yang dikembalikan dapat memiliki celah.

Metadata

Untuk informasi tentang urutan, kueri tampilan katalog sys.sequences .

Keamanan

Izin

Memerlukan izin UPDATE pada objek urutan atau skema urutan. Untuk contoh pemberian izin, lihat contoh F nanti dalam topik ini.

Rantai Kepemilikan

Objek urutan mendukung penautan kepemilikan. Jika objek urutan memiliki pemilik yang sama dengan prosedur tersimpan panggilan, pemicu, atau tabel (memiliki objek urutan sebagai batasan default), tidak ada pemeriksaan izin yang diperlukan pada objek urutan. Jika objek urutan tidak dimiliki oleh pengguna yang sama dengan prosedur tersimpan panggilan, pemicu, atau tabel, pemeriksaan izin diperlukan pada objek urutan.

Saat fungsi NEXT VALUE FOR digunakan sebagai nilai default dalam tabel, pengguna memerlukan izin INSERT pada tabel, dan izin UPDATE pada objek urutan, untuk menyisipkan data menggunakan default.

  • Jika batasan default memiliki pemilik yang sama dengan objek urutan, tidak ada izin yang diperlukan pada objek urutan saat batasan default dipanggil.

  • Jika batasan default dan objek urutan tidak dimiliki oleh pengguna yang sama, izin diperlukan pada objek urutan bahkan jika dipanggil melalui batasan default.

Audit

Untuk mengaudit fungsi NEXT VALUE FOR , pantau SCHEMA_OBJECT_ACCESS_GROUP.

Contoh

Untuk contoh pembuatan urutan dan menggunakan fungsi NEXT VALUE FOR untuk menghasilkan nomor urut, lihat Nomor Urutan.

Contoh berikut menggunakan urutan bernama CountBy1 dalam skema bernama Test. Jalankan pernyataan berikut untuk membuat Test.CountBy1 urutan. Contoh C dan E menggunakan AdventureWorks2022 database, sehingga urutan dibuat dalam database tersebut CountBy1 .

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

J. Menggunakan urutan dalam pernyataan pilih

Contoh berikut membuat urutan bernama CountBy1 yang meningkat satu per satu setiap kali digunakan.

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

Berikut adalah hasil yang ditetapkan.

FirstUse  
1  
 
SecondUse  
2

B. Mengatur variabel ke nilai urutan berikutnya

Contoh berikut menunjukkan tiga cara untuk mengatur variabel ke nilai berikutnya dari angka urutan.

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. Menggunakan urutan dengan fungsi jendela peringkat

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

D. Menggunakan fungsi NEXT VALUE FOR dalam definisi batasan default

Menggunakan fungsi NEXT VALUE FOR dalam definisi batasan default didukung. Untuk contoh penggunaan NEXT VALUE FOR dalam pernyataan CREATE TABLE, lihat Contoh Nomor Urutan C. Contoh berikut menggunakan ALTER TABLE untuk menambahkan urutan sebagai default ke tabel saat ini.

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. Menggunakan fungsi NEXT VALUE FOR dalam pernyataan INSERT

Contoh berikut membuat tabel bernama TestTable lalu menggunakan NEXT VALUE FOR fungsi untuk menyisipkan baris.

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. Menggunakan fungsi NEXT VALUE FOR dengan SELECT ... KE

Contoh berikut menggunakan SELECT ... INTO pernyataan untuk membuat tabel bernama Production.NewLocation dan menggunakan NEXT VALUE FOR fungsi untuk menomori setiap baris.

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

F. Memberikan izin untuk menjalankan NEXT VALUE FOR

Contoh berikut memberikan izin UPDATE kepada pengguna bernama AdventureWorks\Larry izin untuk menjalankan NEXT VALUE FOR menggunakan Test.CounterSeq urutan .

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

Lihat Juga

CREATE SEQUENCE (Transact-SQL)
ALTER SEQUENCE (Transact-SQL)
Nomor Urut