Saya mencoba untuk mendapatkan kembali nilai kunci setelah pernyataan INSERT. Contoh: Saya punya tabel dengan nama atribut dan id. id adalah nilai yang dihasilkan.
INSERT INTO table (name) VALUES('bob');
Sekarang saya ingin mendapatkan id kembali di langkah yang sama. Bagaimana ini dilakukan?
Kami menggunakan Microsoft SQL Server 2008.
sql
sql-server
sql-server-2008
melbic
sumber
sumber
Jawaban:
Tidak perlu untuk PILIH yang terpisah ...
Ini juga berfungsi untuk kolom non-IDENTITAS (seperti GUID)
sumber
Gunakan
SCOPE_IDENTITY()
untuk mendapatkan nilai ID baruhttp://msdn.microsoft.com/en-us/library/ms190315.aspx
sumber
id
identitasid
, jadi ya.Adalah taruhan teraman karena ada masalah yang diketahui dengan konflik Klausa OUTPUT pada tabel dengan pemicu. Membuat ini sangat tidak dapat diandalkan karena bahkan jika meja Anda saat ini tidak memiliki pemicu - seseorang menambahkan satu di telepon akan merusak aplikasi Anda. Bom waktu semacam perilaku.
Lihat artikel msdn untuk penjelasan lebih lanjut:
http://blogs.msdn.com/b/sqlprogrammability/archive/2008/07/11/update-with-output-clause-triggers-and-sqlmoreresults.aspx
sumber
Entity Framework melakukan sesuatu yang mirip dengan jawaban gbn:
Hasil output disimpan dalam variabel tabel sementara, dan kemudian dipilih kembali ke klien. Harus mewaspadai gotcha:
Saya tidak tahu mengapa EF akan bergabung dengan tabel ephemeral kembali ke meja nyata (dalam keadaan apa keduanya tidak cocok).
Tapi itulah yang dilakukan EF.
SQL Server 2008 atau lebih baru. Jika ini 2005 maka Anda kurang beruntung.
sumber
Customer
catatan yang dimasukkan , karena mungkin ada logika sisi DB lainnya yang memengaruhinya, misalnyaDEFAULT
pada beberapa kolom, pemicu pada tabel, dll. EF memperbarui entitas (objek) yang digunakan untuk menyisipkan, sehingga sisi klien mendapatkan objek pelanggan dengan ID dan segala sesuatu yang mewakili status baris saat ini.@@IDENTITY
Merupakan fungsi sistem yang mengembalikan nilai identitas yang dimasukkan terakhir.sumber
Ada banyak cara untuk keluar setelah dimasukkan
IDENT_CURRENT : Ini mengembalikan identitas terakhir yang dibuat untuk tabel atau tampilan tertentu dalam sesi apa pun.
SCOPE_IDENTITY : Ini mengembalikan identitas terakhir dari sesi yang sama dan cakupan yang sama. Ruang lingkup adalah prosedur / pemicu tersimpan dll.
@@ IDENTITY : Ini mengembalikan identitas terakhir dari sesi yang sama.
sumber
out put
untukbulk insert
dan insert olehselect statement
. terima kasih atas saran AndaSolusi terbaik dan paling pasti adalah menggunakan
SCOPE_IDENTITY()
.Hanya Anda harus mendapatkan identitas lingkup setelah setiap sisipan dan menyimpannya dalam variabel karena Anda dapat memanggil dua sisipan dalam cakupan yang sama.
ident_current
dan@@identity
mungkin mereka bekerja tetapi mereka bukan ruang lingkup yang aman. Anda dapat memiliki masalah dalam aplikasi besarLebih detail ada di sini Microsoft docs
sumber
select @duplicataId = SCOPE_IDENTITY()
OUTPUT
klausa adalah solusi yang lebih baik, lebih murni :)Anda dapat menggunakan
scope_identity()
untuk memilih ID dari baris yang baru saja Anda masukkan ke dalam variabel kemudian pilih kolom apa pun yang Anda inginkan dari tabel di mana id = identitas yang Anda dapatkan dariscope_identity()
Lihat di sini untuk info MSDN http://msdn.microsoft.com/en-us/library/ms190315.aspx
sumber
Ada beberapa cara untuk mendapatkan ID yang dimasukkan terakhir setelah memasukkan perintah.
@@IDENTITY
: Ini mengembalikan nilai Identitas terakhir yang dihasilkan pada Koneksi di sesi saat ini, terlepas dari Tabel dan ruang lingkup pernyataan yang menghasilkan nilaiSCOPE_IDENTITY()
: Ini mengembalikan nilai identitas terakhir yang dihasilkan oleh pernyataan insert di lingkup saat ini di koneksi saat ini terlepas dari tabel.IDENT_CURRENT(‘TABLENAME’)
: Ini mengembalikan nilai identitas terakhir yang dihasilkan pada tabel yang ditentukan terlepas dari koneksi, sesi, atau ruang lingkup. IDENT_CURRENT tidak dibatasi oleh ruang lingkup dan sesi; terbatas pada tabel yang ditentukan.Sekarang tampaknya lebih sulit untuk memutuskan mana yang akan cocok dengan kebutuhan saya.
Saya lebih suka SCOPE_IDENTITY ().
Jika Anda menggunakan pilih SCOPE_IDENTITY () bersama dengan TableName dalam pernyataan insert, Anda akan mendapatkan hasil yang tepat sesuai harapan Anda.
Sumber: CodoBee
sumber
Ini adalah bagaimana saya menggunakan OUTPUT INSERTED, ketika menyisipkan ke tabel yang menggunakan ID sebagai kolom identitas di SQL Server:
sumber
Anda dapat menambahkan pernyataan pilih ke pernyataan sisipan Anda. Integer myInt = Masukkan nilai table1 (FName) ('Fred'); Pilih Scope_Identity (); Ini akan mengembalikan nilai identitas ketika dieksekusi scaler.
sumber
Setelah melakukan penyisipan ke tabel dengan kolom identitas, Anda dapat mereferensikan @@ IDENTITY untuk mendapatkan nilai: http://msdn.microsoft.com/en-us/library/aa933167%28v=sql.80%29.aspx
sumber
* Urutan parameter dalam string koneksi terkadang penting. * Lokasi parameter Penyedia dapat mematahkan kursor recordset setelah menambahkan baris. Kami melihat perilaku ini dengan penyedia SQLOLEDB.
Setelah baris ditambahkan, bidang baris tidak tersedia, KECUALI Penyedia ditentukan sebagai parameter pertama dalam string koneksi. Ketika penyedia mana pun dalam string koneksi kecuali sebagai parameter pertama, bidang baris yang baru dimasukkan tidak tersedia. Ketika kami memindahkan Penyedia ke parameter pertama, bidang baris secara ajaib muncul.
sumber