Belirtiler

Bir kimlik sütununa eklenen değerleri almak için SCOPE_IDENTITY() veya @@IDENTITYişlevlerini kullanırken, bu işlevlerin bazen yanlış değerler geri getir olduğunu fark edersiniz. Sorun yalnızca sorgular paralel yürütme planları kullanıyorsa ortaya çıkar. Sorgularınızın paralel yürütme planları kullan gidip kullanmayacaklarını belirleme konusunda daha fazla bilgi için, Microsoft İndirmeleri'nde yer alan aşağıdaki teknik makalede yer alan Intra-query parallelism bölümüne bakın:

Neden

Microsoft, bu makalenin başında listelenen Microsoft ürünlerinde bunun bir sorun olduğunu onaylar.

Çözüm

Toplu güncelleştirme bilgileri

SQL Server 2008 R2 Service Pack 1

Bu soruna ilişkin düzeltme ilk olarak SQL Server 2008 R2 Service Pack 1 için Toplu Güncelleştirme 5'te yayınlandı. Bu toplu güncelleştirme paketini alma hakkında daha fazla bilgi için, Microsoft Bilgi Bankası'daki makaleyi görüntülemek üzere aşağıdaki makale numarasına tıklayın: 

2659694SQL Server 2008 R2 Service Pack 1 için Toplu Güncelleştirme Paketi 5

NotDerlemeler kümülatif olduğundan, her yeni düzeltme sürümü önceki SQL Server 2008 R2 düzeltme sürümüne dahil olan tüm düzeltmeleri ve tüm güvenlik düzeltmelerini içerir. Bu düzeltmeyi içeren en son düzeltmeyi uygulamanız önerilir. Daha fazla bilgi için Microsoft Bilgi Bankası'ndaki makaleyi görüntülemek üzere aşağıdaki makale numarasına tıklayın:

2567616SQL Server 2008 R2 Service Pack 1'den sonra yayımlanan SQL Server 2008 R2 derlemeleri

Geçici Çözüm

Microsoft, paralel planlar her zaman güvenilir olmadıklarında, sorgularında bu işlevlerden herhangi birini kullanmamanızı önerir. Bunun yerine, aşağıdaki örnekte gösterildiği gibi kimlik değerini almak için INSERT deyiminin OUTPUT yan tümcesini kullanın.

OUTPUT yan tümcesi kullanma örneği:

DECLARE @MyNewIdentityValues tablo(myidvalues int) declare @A tablo (ID int birincil anahtar) @A ekleme (1) declare @B tablo (ID int birincil anahtar kimliği(1,1), B int not null) @B ekleme (1) ardından     [SatırSay çok] = @@RowCount,     [@@IDENTITY] = @@IDENTITY,     [SCOPE_IDENTITY] = SCOPE_IDENTITY() istatistik profilini ayarlama hücreye _ddr_T inserted.ID @MyNewIdentityValues'a çıkış @MyNewIdentityValues     ardından             b.ID         @A a             left join @B b on b.ID = 1             b2'@B b2'ye sol birleşim. B = -1             t.T _ddr_T -1 üzerinde t'ye sol birleşim         burada (t2'den * _ddr_T seçin; burada t2.ID = -1) İstatistik profilini kapat ardından     [SatırSay çok] = @@RowCount,     [@@IDENTITY] = @@IDENTITY,     [SCOPE_IDENTITY] = SCOPE_IDENTITY()     [IDENT_CURRENT] = IDENT_CURRENT('_ddr_T') seçeneklerden * @MyNewIdentityValues Git

Sizin durumu için bu işlevlerden birini kullanmak zorundaysanız, bu sorunu geçici olarak çözmek için aşağıdaki yöntemlerden birini kullanabilirsiniz.

Yöntem 1:

Sorgunuza aşağıdaki seçeneği belirtin

OPTION (MAXDOP 1)

Not:Bu, sorgunun SELECT kısmının performansını zarara neden olabilir.

Yöntem 2:

SELECT bölümünde verilen değeri bir dizi değişkene (veya tek bir tablo değişkenine) okuyun ve MAXDOP=1 ile hedef tabloya ekleme. INSERT planı paralel olmayacaktır, ancak istenen performansı elde etmek için SELECT'iniz paralel olarak doğru semantik elde edilir.

Yöntem 3:

Paralellik seçeneğinin en yüksek derecesini 1 olarak ayarlamak için aşağıdaki deyimi çalıştırın:

sp_configure 'en yüksek paralellik derecesi', 1

Git

geçersiz kılmayla yeniden yapılandırma

Git

Not:Bu yöntem sunucuda performans düşüşüne neden olabilir. Testte veya hazırlama ortamında değerlendirmedikçe, bu yöntemi kullanmamalısınız.

Ek Bilgi

Bu soruna ilişkin Microsoft Connect

En Yüksek Paralellik Derecesi (MAXDOP)

Daha fazla yardıma mı ihtiyacınız var?

Daha fazla seçenek mi istiyorsunuz?

Abonelik avantajlarını keşfedin, eğitim kurslarına göz atın, cihazınızın güvenliğini nasıl sağlayacağınızı öğrenin ve daha fazlasını yapın.

Topluluklar, soru sormanıza ve soruları yanıtlamanıza, geri bildirimde bulunmanıza ve zengin bilgiye sahip uzmanlardan bilgi almanıza yardımcı olur.