MS SQL 2005 veya MS SQL 2008'de yeni eklediğim satırın id'sini nasıl alırım, bu konuda hangi komut hangi durumda kullanılmalı?
October 25, 2008 at 7:44 AM
—
oozturk
Merhaba,
Uzun zamandır yazı yazmaya fırsatım olmuyordu, hazır zamanım varken birşeyler karalayayım dedim. Bugün maillarıma bakarken bir arkadaşım sormuş bu sorunu, ben de hazır cevap verecekken buraya yazayım dedim.
Önce kullanılabilecek komutlara ismen bakalım, sonra ne zaman ve nerelerde kullanılabileceklerine bakarız;
- @@Identity
- Ident_Current('tabloadı')
- Scope_Identity()
- Sequence
@@Identity
Bu komut o esnada kullanılan veritabanına herhangi bir kullanıcı tarafından, herhangi bir yolla (hatta trigger kullanıyorsanız buna triggerlar da dahil olmak üzere) en son eklenmiş olan Id'yi getirir. Kullanımında çok dikkatli olmak ve ne yaptığını çok iyi biliyor olmak gerekir. Bazı bulk copy durumlarında bir sefere mahsus olarak null'da dönebilir bu değer, bununla alakalı yazıyı da www.microsoft.com adresinde bulabilirsiniz.
Ident_Current('tabloadı')
@@Identity'den farklı olarak bu sefer mevcut tablo için yine herhangi bir kullanıcı, session, yol ile yaratılmış en son kaydın Id'si alınabilir.
Scope_Identity()
Bu komut ile mevcut bağlantı ile mevcut scope da mevcut kullanıcının herhangi bir tabloya, herhangi bir yolla eklediği en son kaydın Id'si alınabilir.
Misal vermek gerekirse:
- Bir stored procedure hazırlamış olalım ve 3 farklı tabloya 3 farklı kayıt yaratmış olalım. Bu kayıtlardan en son hangsini yarattıysak onun Id'sini Select sope_identity() ile alabiliriz. Sonra bu eklediğimiz satıra bağlı olarak ekleyeceğimiz ya da değiştireceğimiz satırları bu değerle güncelleyebilir, ekleyebiliriz.
Sequence
Bu komut zaten diğer SQL serverlarda mevcut idi, MS SQL'e 2005 versiyonunda eklendi. rakamsal değerlere sahip Id kolonu kullandığımızda, yeni bir satır ekleyeceğimiz zaman bu komutu çağırıp mevzu bahis tablo için bir önceki kayıttan sonraki değer'i alabiliriz. Bu sayede alacağımız değer bize ait olacağı için aynı anda başka bir komut ile aynı işlem denendiğinde aynı değer verilemeyecek ve çakışma önlenmiş olacaktır. Bu komutun geri dönüşü olmadığı için herhangi bir sebepten tabloya yazamamış ya da yazmamış olursak yine de o Id değeri alınmış ve artık kullanılamaz olmuş olur.
Bu komut ile alakalı daha fazla bilgi için yine www.microsoft.com adresine bakılabilir.
Misal vermek gerekirse:
- Bir programımız var ve birden fazla kullanıcısı var diyelim ve kullanıcılardan birden fazlası aynı anda aynı işlemi yaptığında satır eklemesi yapılacak olsun, satır eklenecek olan tablodaki son Id değeri de 2 olsun. Sequence kullandığımız için birine Id olarak 3 diğerine 4 verilecektir.
İyi çalışmalar dilerim.