Simptomi
Kada koristite funkcije SCOPE_IDENTITY() ili @@IDENTITYza preuzimanje vrednosti umetnutih u kolonu identiteta, možda ćete primetiti da ove funkcije ponekad daju netačne vrednosti. Do problema dolazi samo kada upiti koriste paralelne planove izvršavanja. Više informacija o tome kako da utvrdite da li će upiti koristiti paralelne planove izvršavanja potražite u odeljku Intra-query paralelism u sledećem tehničkom članku o Preuzimanju korporacije Microsoft:
Uzrok
Microsoft je potvrdio da je u tome problem u Microsoft proizvodima koji su navedeni na početku ovog članka.
Rezolucija
Kumulativne informacije o ažuriranju
SQL Server 2008 R2 servisni paket 1
Rešenje ovog problema je prvo objavljeno u kumulativnoj ispravki 5 za SQL Server 2008 R2 servisni paket 1. Više informacija o tome kako da nabavite ovaj kumulativni paket ispravki potražite u sledećem broju članka da biste prikazali članak u Microsoft bazi znanja:
2659694Kumulativna ispravka paketa 5 za SQL Server 2008 R2 servisni paket 1
Napomišite Pošto su verzije kumulativne, svako novo izdanje popravke sadrži sve hitne ispravke i sve bezbednosne ispravke koje su uključene u prethodno izdanje popravke za SQL Server 2008 R2. Preporučujemo da razmotrite primenu najnovijeg izdanja popravke koje sadrži ovu hitnu ispravku. Da biste dobili više informacija, kliknite na sledeći broj članka da biste prikazali članak u Microsoft bazi znanja:
2567616Restrukcije SQL Server 2008 R2 objavljene su nakon objave sistema SQL Server 2008 R2 Service Pack 1
Zaokrenite posao
Microsoft preporučuje da ne koristite bilo koju od ovih funkcija u upitima kada su paralelni planovi uključeni jer nisu uvek pouzdani. Umesto toga koristite odredbu OUTPUT izraza INSERT da biste preuzeli vrednost identiteta kao što je prikazano u primeru ispod.
Primer korišćenja odredbe OUTPUT:
DECLARE @MyNewIdentityValues tabela(int mojevrednosti)
declare @A table (ID int primary key)
insert into @A values (1)
declare @B table (ID int primary key identity(1,1), B int not null)
insert into @B values (1)
izaberite stavku
[Broj Redova] = @@RowCount,
[@@IDENTITY] = @@IDENTITY,
[SCOPE_IDENTITY] = SCOPE_IDENTITY()
set statistics profile on
insert into _ddr_T
izlazne inserted.ID u @MyNewIdentityValues
izaberite stavku
b.ID
iz @A a
levi spoj @B b na b.ID = 1
left join @B b2 on b2. B = -1
levi spoj _ddr_T t na t.T = -1
gde ne postoji (izaberite * iz _ddr_T t2 gde t2.ID = -1)
set statistics profile off
izaberite stavku
[Broj Redova] = @@RowCount,
[@@IDENTITY] = @@IDENTITY,
[SCOPE_IDENTITY] = SCOPE_IDENTITY(),
[IDENT_CURRENT] = IDENT_CURRENT('_ddr_T')
izaberite * iz @MyNewIdentityValues
idi
Ako vaša situacija zahteva da koristite bilo koju od ovih funkcija, možete da koristite jedan od sledećih metoda da biste rešili problem.
1. metod:
Uključite sledeću opciju u upit
OPTION (MAXDOP 1)
Napomi:Ovo može da škodi performansama SELECT dela upita.
2. metod:
Pročitajte vrednost iz SELECT dela u skup promenljivih (ili promenljive jedne tabele) i umetnite u ciljnu tabelu sa MAXDOP=1. Pošto PLAN INSERT neće biti paralelno, dobijate pravu semantiku, ali SELECT će biti paralelno da biste postigli željene performanse.
3. metod:
Pokrenite sledeću izjavu da biste maksimalni stepen paralelism opcije postavili na 1:
sp_configure "maksimalni stepen paralelisma", 1
idi
ponovo konfigurisanje sa zamenom
idi
Napom:Ovaj metod može da izazove poništenje performansi na serveru. Ovaj metod ne bi trebalo da koristite osim ako ga niste procenjili u testiranju ili okruženju.
Više informacija
Microsoft Connect buba za ovaj problemhttps://docs.microsoft.com/en-us/collaborate/connect-redirect