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