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

IDENT_CURRENT vs @@IDENTITY vs SCOPE_IDENTITY di SQL Server:Apa Perbedaannya?

Di SQL Server, jika Anda perlu mengembalikan nilai yang dibuat di kolom identitas, Anda memiliki beberapa opsi. Masing-masing opsi ini, meskipun serupa, melakukan hal yang sedikit berbeda.

Secara khusus, Anda dapat menggunakan fungsi berikut:

  • IDENT_CURRENT() mengembalikan nilai identitas yang dimasukkan terakhir untuk tabel tertentu.
  • SCOPE_IDENTITY() mengembalikan nilai identitas terakhir yang dimasukkan ke dalam kolom identitas di apa saja tabel di sesi saat ini dan cakupan saat ini.
  • @@IDENTITY mengembalikan nilai identitas yang dimasukkan terakhir di apa saja tabel di sesi saat ini, terlepas dari cakupannya.

Contoh

Berikut adalah contoh yang menunjukkan perbedaan antara ketiga fungsi tersebut.

Pertama, buat dua tabel. Perhatikan perbedaan nilai seed dan increment yang digunakan untuk kolom identitas di setiap tabel:

CREATE TABLE t1(id int IDENTITY(1,1));  
CREATE TABLE t2(id int IDENTITY(150,10));

Sekarang buat pemicu yang menyisipkan baris ke tabel kedua setiap kali baris dimasukkan ke tabel pertama:

CREATE TRIGGER t1_insert_trigger ON t1 FOR INSERT
AS
BEGIN
  INSERT t2 DEFAULT VALUES
END;

Pemicu api dalam lingkup yang berbeda, jadi itu sempurna untuk contoh saya di sini.

Masukkan data ke tabel pertama, lalu pilih hasil dari kedua tabel:

INSERT t1 DEFAULT VALUES;
SELECT id AS t1 FROM t1;
SELECT id AS t2 FROM t2;

Hasil:

+------+
| t1   |
|------|
| 1    |
+------+
(1 row affected)
+------+
| t2   |
|------|
| 150  |
+------+
(1 row affected)

Jadi untuk memperjelas, data ini disisipkan oleh dua ruang lingkup yang berbeda. Sisipkan ke t1 dilakukan oleh ruang lingkup saat ini. Sisipkan ke t2 dilakukan oleh pemicu, yang berjalan dalam lingkup yang berbeda.

Sekarang mari kita pilih dari fungsi yang disebutkan sebelumnya:

SELECT 
  @@IDENTITY AS [@@IDENTITY],
  SCOPE_IDENTITY() AS [SCOPE_IDENTITY()],
  IDENT_CURRENT('t1') AS [IDENT_CURRENT('t1')],
  IDENT_CURRENT('t2') AS [IDENT_CURRENT('t2')];

Hasil:

+--------------+--------------------+-----------------------+-----------------------+
| @@IDENTITY   | SCOPE_IDENTITY()   | IDENT_CURRENT('t1')   | IDENT_CURRENT('t2')   |
|--------------+--------------------+-----------------------+-----------------------|
| 150          | 1                  | 1                     | 150                   |
+--------------+--------------------+-----------------------+-----------------------+

Hasil dikembalikan oleh @@IDENTITY tidak terbatas pada cakupan, dan oleh karena itu mengembalikan nilai identitas yang dimasukkan terakhir, terlepas dari cakupannya.

SCOPE_IDENTITY() mengembalikan nilai identitas dari tabel pertama, karena itu adalah nilai identitas yang dimasukkan terakhir dalam cakupan saat ini (pemicunya berada di luar cakupan saat ini).

IDENT_CURRENT() fungsi hanya mengembalikan nilai identitas terakhir yang dimasukkan ke dalam tabel yang ditentukan, terlepas dari ruang lingkup atau sesi.

Buka Sesi Baru

Sekarang, inilah yang terjadi jika saya membuka sesi baru dan menjalankan pernyataan sebelumnya lagi:

USE Test;
SELECT 
  @@IDENTITY AS [@@IDENTITY],
  SCOPE_IDENTITY() AS [SCOPE_IDENTITY()],
  IDENT_CURRENT('t1') AS [IDENT_CURRENT('t1')],
  IDENT_CURRENT('t2') AS [IDENT_CURRENT('t2')];

Hasil:

+--------------+--------------------+-----------------------+-----------------------+
| @@IDENTITY   | SCOPE_IDENTITY()   | IDENT_CURRENT('t1')   | IDENT_CURRENT('t2')   |
|--------------+--------------------+-----------------------+-----------------------|
| NULL         | NULL               | 1                     | 150                   |
+--------------+--------------------+-----------------------+-----------------------+

Keduanya @@IDENTITY dan SCOPE_IDENTITY() adalah NULL karena mereka hanya mengembalikan hasil dari sesi saat ini. Saya belum melakukan penyisipan kolom identitas apa pun di sesi baru ini, jadi saya mendapatkan NULL.

IDENT_CURRENT() di sisi lain, mengembalikan hasil yang sama seperti pada contoh sebelumnya, sekali lagi karena hasilnya didasarkan pada tabel yang ditentukan, terlepas dari sesi atau cakupannya.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SYSDATETIMEOFFSET() Contoh di SQL Server (T-SQL)

  2. Mendapatkan Pivot-Table yang Dihasilkan Secara Dinamis menjadi Tabel Temp

  3. EF4 - Prosedur tersimpan yang dipilih tidak mengembalikan kolom

  4. Apa yang mewakili ganda di server sql?

  5. Bagaimana SCHEMA_ID() Bekerja di SQL Server