Jelenségek
Ha a SCOPE_IDENTITY() vagy az @@IDENTITYfüggvény segítségével olvassa be az identitásoszlopba beszúrt értékeket, észreveheti, hogy ezek a függvények néha helytelen értékeket ad vissza. A probléma csak akkor jelentkezik, ha a lekérdezések párhuzamos végrehajtási terveket használnak. Ha többet meg szeretné tudni arról, hogy mi alapján állapítható meg, hogy a lekérdezések párhuzamos végrehajtási terveket fognak-e használni, olvassa el a Microsoft-letöltések alábbi technikai cikkének Lekérdezést párhuzamosság szakaszát:
A probléma oka
A Microsoft megerősítette, hogy a cikkben tárgyalt jelenség a cikk elején felsorolt termékek hibájára vezethető vissza.
Megoldás
Kumulatív frissítéssel kapcsolatos információk
SQL Server 2008 R2 Service Pack 1
A hibajavítás először az SQL Server 2008 R2 Service Pack 1 szervizcsomag 5. összegző frissítésében jelent meg. A halmozott frissítési csomag beszerzéséről további információt a következő cikkszámra kattintva talál a Microsoft Tudásbázisban:
2659694Kumulatív frissítéscsomag 5 for SQL Server 2008 R2 Service Pack 1
Megjegyzés:Mivel a buildek kumulatívak, minden egyes új javítás tartalmazza az SQL Server 2008 R2 korábbi kiadásában szereplő összes gyorsjavítást és biztonsági javítást. Javasoljuk, hogy alkalmazza a gyorsjavítást tartalmazó legújabb javítást. További információ a Microsoft Tudásbázis következő számú cikkében olvasható (a cikk megnyitásához kattintson a sorszámra):
2567616Az SQL Server 2008 R2 service pack 1 szervizcsomaggal kiadott SQL Server 2008 R2 buildek
Kerülő megoldás
A Microsoft azt javasolja, hogy ne használja ezeket a függvényeket a lekérdezésekben, ha párhuzamos tervek is vannak, mivel nem mindig megbízhatók. Ehelyett az INSERT utasítás OUTPUT záradékával olvassa be az identitásértéket az alábbi példában látható módon.
Példa a OUTPUT záradékra:
DECLARE @MyNewIdentityValues table(myidvalues int)
tábla @A deklarál (id int primary key) insert into @A values (1) tábla @B deklarálható (id int primary key identity(1,1), B int not null) insert into @B values (1) válassza a [SorSzám] = @@RowCount, [@@IDENTITY] = @@IDENTITY, [SCOPE_IDENTITY] = SCOPE_IDENTITY() set statistics profile on beszúrás _ddr_T kimenet inserted.ID a @MyNewIdentityValues válassza a b.ID a @A bal oldali @B b a b.ID = 1 bal oldali @B b2 on b2. B = -1 left join _ddr_T t on t.T = -1 where not exists (select * from _ddr_T t2 where t2.ID = -1) set statistics profile off válassza a [SorSzám] = @@RowCount, [@@IDENTITY] = @@IDENTITY, [SCOPE_IDENTITY] = SCOPE_IDENTITY(), [IDENT_CURRENT] = IDENT_CURRENT('_ddr_T') select * from @MyNewIdentityValues ugrásHa az Ön helyzete miatt e függvények bármelyikét használnia kell, az alábbi módszerek egyikével megkerülheti a problémát.
1. módszer:
Az alábbi lehetőségek használata a lekérdezésben
OPTION (MAXDOP 1)
Megjegyzés:Ez sértheti a lekérdezés SELECT részének teljesítményét.
2. módszer:
Olvassa fel a SELECT rész értékét egy változókészletbe (vagy egyetlen táblaváltozóba), majd szúrja be a céltáblába a MAXDOP=1 értékkel. Mivel az INSERT terv nem párhuzamos, a megfelelő szemantikus eredményt fogja kapni, a SELECT ugyanakkor párhuzamos lesz a kívánt teljesítmény eléréséhez.
3. módszer:
Az alábbi utasítás futtatásával állítsa a párhuzamosság maximális mértékét 1-re:
sp_configure "max degree of parallelism", 1
ugrás
újrakonfigurálás felülbírálással
ugrás
Megjegyzés:Ez a módszer teljesítményromlást okozhat a kiszolgálón. Csak akkor használja ezt a módszert, ha tesztelési vagy tesztkörnyezetben, vagy tesztkörnyezetben kiértékelték.