I'm mencoba untuk mendapatkan kunci-nilai kembali setelah INSERT-pernyataan. Contoh: I've punya sebuah tabel dengan atribut nama dan id. id adalah dihasilkan nilai.
INSERT INTO table (name) VALUES('bob');
Sekarang saya ingin mendapatkan id kembali dalam langkah yang sama. Bagaimana hal ini dilakukan?
Kami're menggunakan Microsoft SQL Server 2008.
INSERT INTO files (title) VALUES ('whatever');
SELECT * FROM files WHERE id = SCOPE_IDENTITY();
Adalah taruhan paling aman karena ada masalah yang diketahui dengan OUTPUT Klausul konflik pada tabel dengan pemicu. Membuat ini cukup bisa diandalkan karena bahkan jika meja anda doesn't saat ini memiliki pemicu - orang menambahkan satu down line akan istirahat aplikasi anda. Bom waktu semacam mendatang.
Lihat artikel msdn untuk penjelasan lebih dalam:
Kerangka entitas melakukan sesuatu yang mirip dengan pgs's jawaban:
DECLARE @generated_keys table([Id] uniqueidentifier)
INSERT INTO Customers(FirstName)
OUTPUT inserted.CustomerID INTO @generated_keys
VALUES('bob');
SELECT t.[CustomerID]
FROM @generated_keys AS g
JOIN dbo.Customers AS t
ON g.Id = t.CustomerID
WHERE @@ROWCOUNT > 0
Hasil output disimpan di tabel sementara variabel, dan kemudian terpilih kembali untuk klien. Harus diketahui dari gotcha:
sisipan dapat menghasilkan lebih dari satu baris, sehingga variabel yang dapat menyimpan lebih dari satu baris, sehingga anda dapat kembali lebih dari satu
ID
Aku tidak tahu mengapa EF akan bergabung dalam fana meja kembali ke meja nyata (dalam keadaan apa akan dua tidak sesuai).
Tapi yang's apa yang EF tidak.
SQL Server 2008 atau yang lebih baru saja. Jika itu's 2005 maka anda're beruntung.
Anda dapat menggunakan scope_identity()
untuk memilih ID baris anda hanya dimasukkan ke dalam suatu variabel kemudian hanya pilih kolom apapun yang anda inginkan dari tabel yang mana id = identitas anda dapatkan dari scope_identity()
Lihat di sini untuk info MSDN http://msdn.microsoft.com/en-us/library/ms190315.aspx
Yang terbaik dan paling yakin solusinya adalah menggunakan SCOPE_IDENTITY()
.
Hanya anda harus mendapatkan ruang lingkup identitas setelah setiap menyisipkan dan menyimpannya dalam variabel karena anda dapat memanggil dua menyisipkan dalam lingkup yang sama.
ident_current
dan @@identitas
mungkin mereka bekerja, tetapi mereka tidak aman lingkup. Anda dapat memiliki masalah dalam aplikasi besar
declare @duplicataId int
select @duplicataId = (SELECT SCOPE_IDENTITY())
Lebih detail di sini Microsoft docs
Ada banyak cara untuk keluar setelah menyisipkan
Ketika anda menyisipkan data ke dalam tabel, anda dapat menggunakan OUTPUT klausul untuk kembali salinan data yang telah dimasukkan ke dalam tabel. Yang OUTPUT klausul mengambil dua bentuk dasar: OUTPUT dan OUTPUT KE dalam. Gunakan bentuk OUTPUT jika anda ingin mengembalikan data ke aplikasi yang memanggil. Menggunakan OUTPUT DALAM bentuk jika anda ingin mengembalikan data ke tabel atau tabel variabel.
DECLARE @MyTableVar TABLE (id INT,NAME NVARCHAR(50));
INSERT INTO tableName
(
NAME,....
)OUTPUT INSERTED.id,INSERTED.Name INTO @MyTableVar
VALUES
(
'test',...
)
IDENT_CURRENT: kembali terakhir identitas yang dibuat untuk suatu tabel atau view di setiap sesi.
SELECT IDENT_CURRENT('tableName') AS [IDENT_CURRENT]
SCOPE_IDENTITY: kembali terakhir identitas dari sesi yang sama dan lingkup yang sama. Ruang lingkup adalah sebuah stored procedure/trigger dll.
SELECT SCOPE_IDENTITY() AS [SCOPE_IDENTITY];
@@IDENTITAS: kembali terakhir identitas dari sesi yang sama.
SELECT @@IDENTITY AS [@@IDENTITY];
Ini adalah bagaimana saya menggunakan OUTPUT DIMASUKKAN, ketika memasukkan ke sebuah meja yang menggunakan ID sebagai identitas kolom di SQL Server:
'myConn is the ADO connection, RS a recordset and ID an integer
Set RS=myConn.Execute("INSERT INTO M2_VOTELIST(PRODUCER_ID,TITLE,TIMEU) OUTPUT INSERTED.ID VALUES ('Gator','Test',GETDATE())")
ID=RS(0)
Anda dapat menambahkan pernyataan select untuk menyisipkan pernyataan. Integer myInt = Insert into tabel1 (FName) values('Fred'); Pilih Scope_Identity(); Ini akan mengembalikan nilai identitas ketika dieksekusi scaler.
Order Parameter dalam connection string ini kadang-kadang penting. Penyedia parameter's lokasi dapat mematahkan recordset kursor setelah menambahkan baris. Kita melihat perilaku ini dengan SQLOLEDB.
Setelah baris ini menambahkan, baris kolom tidak tersedia, KECUALI Penyedia ditetapkan sebagai parameter pertama pada connection string. Ketika penyedia mana saja dalam string koneksi kecuali sebagai parameter pertama, yang baru dimasukkan baris kolom tidak tersedia. Ketika kami pindah Provider untuk parameter pertama, baris bidang ajaib muncul.
Ini mungkin sedikit old-school, tapi ada banyak orang-orang yang lebih tua menggunakan PHP, Pra 5.5 untuk menjadi lebih tepat. Rincian lebih lanjut dapat ditemukan di http://php.net/manual/en/function.mysql-insert-id.php
$last = mysql_insert_id();
Setelah melakukan insert ke table dengan kolom identitas, anda dapat referensi @@IDENTITAS untuk mendapatkan nilai: http://msdn.microsoft.com/en-us/library/aa933167%28v=sql.80%29.aspx