NILAI BERIKUTNYA UNTUK (Transact-SQL)
Berlaku untuk: SQL ServerAzure SQL Database Azure 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.
Sintaks
NEXT VALUE FOR [ database_name . ] [ schema_name . ] sequence_name
[ OVER (<over_order_by_clause>) ]
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 atauINSERT ... 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 set hasilnya.
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