Daha
Eklenen satırın kimliğini almanın en iyi yolu nedir?
Eklenen satırın IDENTITY
sini almanın en iyi yolu nedir?
@@IDENTITYve
IDENT_CURRENTve
SCOPE_IDENTITY` hakkında bilgim var ancak her birinin artılarını ve eksilerini anlamıyorum.
Lütfen birisi farkları ve her birini ne zaman kullanmam gerektiğini açıklayabilir mi?
1051
3
@@IDENTITY
geçerli oturumdaki herhangi bir tablo için tüm kapsamlarda oluşturulan son kimlik değerini döndürür. Kapsamlar arasında olduğu için Burada dikkatli olmanız gerekir. Geçerli deyiminiz yerine bir tetikleyiciden bir değer alabilirsiniz.SCOPE_IDENTITY()
geçerli oturumdaki ve geçerli kapsamdaki herhangi bir tablo için oluşturulan son kimlik değerini döndürür. Genel olarak kullanmak istediğiniz şey.IDENT_CURRENT('tableName')
herhangi bir oturumda ve herhangi bir kapsamda belirli bir tablo için oluşturulan son kimlik değerini döndürür. Bu, yukarıdaki ikisinin tam olarak ihtiyacınız olan şey olmaması durumunda (çok nadir), değeri hangi tablodan istediğinizi belirtmenize olanak tanır. Ayrıca, @Guy Starbuck'ın belirttiği gibi, "İçine kayıt eklemediğiniz bir tablo için geçerli IDENTITY değerini almak istiyorsanız bunu kullanabilirsiniz."INSERT
deyiminin [
OUTPUT` cümlesi]5, bu deyim aracılığıyla eklenen her satıra erişmenizi sağlayacaktır. Belirli bir deyime yönelik olduğundan, yukarıdaki diğer fonksiyonlara göre daha basittir. Ancak, biraz daha ayrıntılıdır (bir tablo değişkenine/temp tablosuna eklemeniz ve ardından bunu sorgulamanız gerekir) ve deyimin geri alındığı bir hata senaryosunda bile sonuç verir. Bununla birlikte, sorgunuz paralel bir yürütme planı kullanıyorsa, bu, kimliği elde etmek için tek garantili yöntemdir (paralelliği kapatmak dışında). Ancak, tetikleyicilerden önce yürütülür ve tetikleyici tarafından oluşturulan değerleri döndürmek için kullanılamaz.MSDN
@@IDENTITY geçerli SQL Bağlantısı kullanılarak eklenen son kimliktir. Bu, yalnızca yeni kaydınız için eklenen kimliğe ihtiyaç duyduğunuz ve daha sonra başka satırların eklenip eklenmediğiyle ilgilenmediğiniz bir ekleme saklı yordamından döndürmek için iyi bir değerdir.
SCOPE_IDENTITY geçerli SQL Bağlantısı kullanılarak ve geçerli kapsamda eklenen son kimliktir -- yani, sizin eklemenizden sonra bir tetikleyiciye dayalı olarak eklenen ikinci bir kimlik varsa, bu SCOPE_IDENTITY'ye yansıtılmaz, yalnızca gerçekleştirdiğiniz ekleme yansıtılır. Açıkçası, bunu kullanmak için hiçbir zaman bir nedenim olmadı.
IDENT_CURRENT(tablename) bağlantı veya kapsamdan bağımsız olarak eklenen son kimliktir. İçine kayıt eklemediğiniz bir tablo için geçerli IDENTITY değerini almak istiyorsanız bunu kullanabilirsiniz.