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

Max degree of Parallelism (MAXDOP)

Da li vam je potrebna dodatna pomoć?

Želite još opcija?

Istražite pogodnosti pretplate, pregledajte kurseve za obuku, saznajte kako da obezbedite uređaj i još mnogo toga.