Sqlserver
 sql >> Teknologi Basis Data >  >> RDS >> Sqlserver

Gunakan SCOPE_IDENTITY() untuk Mengembalikan Nilai Identitas yang Disisipkan Terakhir dalam Lingkup yang Sama (SQL Server)

Di SQL Server, Anda dapat menggunakan T-SQL SCOPE_IDENTITY() berfungsi untuk mengembalikan nilai identitas terakhir yang dimasukkan ke dalam kolom identitas dalam lingkup yang sama.

Lingkup adalah modul (prosedur tersimpan, pemicu, fungsi, atau kumpulan). Jika dua pernyataan berada dalam prosedur, fungsi, atau batch tersimpan yang sama, keduanya berada dalam cakupan yang sama.

Perhatikan bahwa ini mengembalikan nilai identitas terakhir yang dihasilkan di tabel mana pun di sesi saat ini . Ini berbeda dengan IDENT_CURRENT() fungsi, yang mengembalikan nilai identitas yang dimasukkan terakhir untuk tabel tertentu , apa pun sesinya.

SCOPE_IDENTITY() sangat mirip dengan @@IDENTITY karena keduanya mengembalikan nilai identitas yang dimasukkan terakhir di sesi saat ini. Perbedaannya adalah SCOPE_IDENTITY() terbatas pada cakupan saat ini, sedangkan @@IDENTITY tidak terbatas pada lingkup tertentu.

Contoh 1 – Penggunaan Dasar

Berikut adalah contoh kode dasar tentang cara kerjanya.

SELECT SCOPE_IDENTITY() AS [Last-Inserted Identity Value];

Hasil:

+--------------------------------+
| Last-Inserted Identity Value   |
|--------------------------------|
| NULL                           |
+--------------------------------+

Alasan untuk hasil NULL adalah karena saya menjalankan pernyataan segera setelah membuka koneksi baru ke SQL Server. SCOPE_IDENTITY() fungsi hanya mengembalikan hasil dari sesi saat ini.

Jadi untuk mendapatkan hasil non-NULL, saya perlu memasukkan nilai ke dalam kolom identitas.

Contoh 2 – Masukkan Nilai untuk Hasil Non-NULL

Dalam contoh ini, saya membuat tabel dengan kolom identitas. Saya kemudian memasukkan nilai default ke dalam tabel itu sebelum memilih isi tabel dan kemudian menjalankan SCOPE_IDENTITY() lagi.

CREATE TABLE scope_identity_test(id int IDENTITY(1,1));
INSERT scope_identity_test DEFAULT VALUES;
SELECT id FROM scope_identity_test;
SELECT SCOPE_IDENTITY() AS [Last-Inserted Identity Value];

Hasil:

+------+
| id   |
|------|
| 1    |
+------+
(1 row affected)
+--------------------------------+
| Last-Inserted Identity Value   |
|--------------------------------|
| 1                              |
+--------------------------------+
(1 row affected)

Tabel memiliki satu baris dan kolom identitasnya memiliki nilai 1. Ini adalah nilai identitas yang dimasukkan terakhir untuk sesi saat ini, dan dengan demikian SCOPE_IDENTITY() juga mengembalikan 1.

Sekarang jika saya menambahkan baris lain, nilainya akan bertambah:

INSERT scope_identity_test DEFAULT VALUES;
SELECT id FROM scope_identity_test;
SELECT SCOPE_IDENTITY() AS [Last-Inserted Identity Value];

Hasil:

+------+
| id   |
|------|
| 1    |
| 2    |
+------+
(2 rows affected)
+--------------------------------+
| Last-Inserted Identity Value   |
|--------------------------------|
| 2                              |
+--------------------------------+
(1 row affected)

Hasil Dari Sesi Baru

Seperti disebutkan, SCOPE_IDENTITY() hanya mengembalikan hasil dari sesi yang sama. Hal ini juga berlaku untuk @@IDENTITY .

Jadi jika saya membuka koneksi baru ke SQL Server dan menjalankan SELECT sebelumnya pernyataan lagi, saya mendapatkan hasil sebagai berikut:

USE Test;
SELECT id FROM scope_identity_test;
SELECT SCOPE_IDENTITY() AS [Last-Inserted Identity Value];

Hasil:

+------+
| id   |
|------|
| 1    |
| 2    |
+------+
(2 rows affected)
+--------------------------------+
| Last-Inserted Identity Value   |
|--------------------------------|
| NULL                           |
+--------------------------------+
(1 row affected)

Sekarang mari kita masukkan baris baru dari dalam sesi baru ini:

INSERT scope_identity_test DEFAULT VALUES;
SELECT id FROM scope_identity_test;
SELECT SCOPE_IDENTITY() AS [Last-Inserted Identity Value];

Hasil:

+------+
| id   |
|------|
| 1    |
| 2    |
| 3    |
+------+
(1 row affected)
+--------------------------------+
| Last-Inserted Identity Value   |
|--------------------------------|
| 3                              |
+--------------------------------+
(3 rows affected)

Jadi itu menyusul segera setelah saya memasukkan nilai identitas baru.

Namun, mari beralih kembali ke sesi awal dan menjalankan SELECT pernyataan lagi (tanpa menyisipkan baris baru):

SELECT id FROM scope_identity_test;
SELECT SCOPE_IDENTITY() AS [Last-Inserted Identity Value];

Hasil:

+------+
| id   |
|------|
| 1    |
| 2    |
| 3    |
+------+
(3 rows affected)
+--------------------------------+
| Last-Inserted Identity Value   |
|--------------------------------|
| 2                              |
+--------------------------------+
(1 row affected)

Jadi SCOPE_IDENTITY() sesi asli hasil belum terpengaruh oleh sesi kedua.

Menambahkan Cakupan Kedua

Hal yang membedakan SCOPE_IDENTITY() dari @@IDENTITY , apakah itu SCOPE_IDENTITY() terbatas pada ruang lingkup saat ini.

Misalnya, jika tabel memiliki pemicu yang menyisipkan nilai identitas ke tabel lain, SCOPE_IDENTITY() hanya akan melaporkan nilai identitas pertama. Itu akan mengabaikan nilai identitas untuk tabel kedua, karena itu dibuat dalam lingkup yang berbeda @@IDENTITY di sisi lain, akan melaporkan nilai identitas untuk tabel kedua (karena mencakup semua cakupan).

Untuk contoh yang saya maksud, lihat IDENT_CURRENT vs @@IDENTITY vs SCOPE_IDENTITY di SQL Server:Apa Perbedaannya?

Artikel itu membahas contoh pemicu seperti yang saya bicarakan di sini.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SQL Server datetime SEPERTI pilih?

  2. Pantau Harapan Hidup Halaman di SQL Server

  3. Cara terbaik untuk mendapatkan PK Guid dari baris yang disisipkan

  4. Bergabung dengan MAX catatan tanggal dalam grup

  5. Bagaimana cara melewatkan variabel nol ke Prosedur Tersimpan SQL dari kode C#.net