Eklenen satırın kimliğini almanın en iyi yolu nedir?

Eklenen satırın IDENTITYsini almanın en iyi yolu nedir?

@@IDENTITYveIDENT_CURRENTveSCOPE_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?

Çözüm
  • @@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."

  • INSERTdeyiminin [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.

Yorumlar (14)

MSDN

@@IDENTITY, SCOPE_IDENTITY ve IDENT_CURRENT, bir tablonun IDENTITY sütununa eklenen son değeri döndürmeleri bakımından benzer işlevlerdir.

@@IDENTITY ve SCOPE_IDENTITY geçerli oturumdaki herhangi bir tabloda oluşturulan son kimlik değerini döndürür. Ancak, SCOPE_IDENTITY değeri yalnızca geçerli kapsam dahilinde döndürür; @@IDENTITY belirli bir kapsamla sınırlı değildir.

IDENT_CURRENT kapsam ve oturum ile sınırlı değildir; belirtilen bir tablo ile sınırlıdır. IDENT_CURRENT, herhangi bir oturumda ve herhangi bir kapsamda belirli bir tablo için oluşturulan kimlik değerini döndürür. Daha fazla bilgi için IDENT_CURRENT bölümüne bakın.

  • IDENT_CURRENT]2 argüman olarak bir tablo alan bir fonksiyondur.
  • Tablo üzerinde bir tetikleyiciniz olduğunda @@IDENTITY kafa karıştırıcı bir sonuç döndürebilir
  • SCOPE_IDENTITY]4 çoğu zaman kahramanınızdır.
Yorumlar (0)

@@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.

Yorumlar (2)