Aku tahu Scope_Identity()
, Identity()
, @@Identity
, dan Ident_Current()
semua mendapatkan nilai dari kolom identitas, tapi aku akan senang untuk mengetahui perbedaannya.
Bagian dari kontroversi yang saya alami adalah apa yang mereka maksud dengan ruang lingkup sebagaimana diterapkan pada fungsi-fungsi di atas?
Saya juga akan menyukai contoh sederhana dari berbagai skenario penggunaannya?
sql
sql-server
identity
Tebo
sumber
sumber
Jawaban:
@@identity
mengembalikan fungsi identitas terakhir dibuat dalam sesi yang sama.scope_identity()
mengembalikan fungsi identitas terakhir dibuat dalam sesi yang sama dan ruang lingkup yang sama.ident_current(name)
mengembalikan identitas terakhir yang dibuat untuk meja tertentu atau melihat di setiap sesi.identity()
Fungsi tidak digunakan untuk mendapatkan identitas, itu digunakan untuk membuat identitas dalamselect...into
query.Sesi ini adalah koneksi basis data. Ruang lingkup adalah kueri saat ini atau prosedur tersimpan saat ini.
Sebuah situasi di mana
scope_identity()
dan@@identity
fungsi berbeda, adalah jika Anda memiliki pemicu di atas meja. Jika Anda memiliki kueri yang menyisipkan catatan, menyebabkan pelat untuk menyisipkan catatan lain di suatu tempat,scope_identity()
fungsi akan mengembalikan identitas yang dibuat oleh permintaan, sementara@@identity
fungsi akan mengembalikan identitas yang dibuat oleh pelatuk.Jadi, biasanya Anda akan menggunakan
scope_identity()
fungsinya.sumber
Pertanyaan bagus.
@@IDENTITY
: mengembalikan nilai identitas terakhir yang dihasilkan pada koneksi SQL Anda (SPID). Sebagian besar waktu akan menjadi apa yang Anda inginkan, tetapi kadang-kadang tidak (seperti ketika pemicu dipecat sebagai respons terhadapINSERT
, dan pemicu mengeksekusiINSERT
pernyataan lain ).SCOPE_IDENTITY()
: mengembalikan nilai identitas terakhir yang dihasilkan dalam lingkup saat ini (yaitu prosedur tersimpan, pemicu, fungsi, dll).IDENT_CURRENT()
: mengembalikan nilai identitas terakhir untuk tabel tertentu. Jangan gunakan ini untuk mendapatkan nilai identitas dariINSERT
, itu tunduk pada kondisi ras (yaitu beberapa koneksi menyisipkan baris pada tabel yang sama).IDENTITY()
: digunakan saat mendeklarasikan kolom dalam tabel sebagai kolom identitas.Untuk referensi lebih lanjut, lihat: http://msdn.microsoft.com/en-us/library/ms187342.aspx .
Untuk meringkas: jika Anda memasukkan baris, dan Anda ingin tahu nilai kolom identitas untuk baris yang baru saja Anda masukkan, selalu gunakan
SCOPE_IDENTITY()
.sumber
Jika Anda memahami perbedaan antara ruang lingkup dan sesi maka akan sangat mudah untuk memahami metode ini.
Posting blog yang sangat bagus oleh Adam Anderson menjelaskan perbedaan ini:
Dengan demikian perbedaan antara tiga metode pengambilan identitas adalah sebagai berikut:
sumber
Lingkup berarti konteks kode yang melakukan
INSERT
pernyataanSCOPE_IDENTITY()
, yang bertentangan dengan lingkup global@@IDENTITY
.Memberikan hasil berbeda.
sumber
Untuk mengklarifikasi masalah dengan
@@Identity
:Misalnya, jika Anda menyisipkan tabel dan tabel tersebut telah memicu melakukan sisipan,
@@Identity
akan mengembalikan id dari sisipan di pelatuk (alog_id
atau sesuatu), sementarascope_identity()
akan mengembalikan id dari sisipan di tabel asli.Jadi, jika Anda tidak memiliki pemicu,
scope_identity()
dan@@identity
akan mengembalikan nilai yang sama. Jika Anda memiliki pemicu, Anda perlu memikirkan nilai apa yang Anda inginkan.sumber
Scope Identity
: Identitas catatan terakhir ditambahkan dalam prosedur tersimpan yang dijalankan.@@Identity
: Identitas catatan terakhir yang ditambahkan dalam kumpulan kueri, atau sebagai hasil dari kueri, mis. Prosedur yang melakukan penyisipan, pemicu kemudian yang memicu yang kemudian menyisipkan catatan akan mengembalikan identitas catatan yang dimasukkan dari pemicu.IdentCurrent
: Identitas terakhir yang dialokasikan untuk tabel.sumber
Berikut ini penjelasan lain dari buku ini :
sumber