Symptomen

Wanneer u SCOPE_IDENTITY() of @@IDENTITYgebruikt om de waarden op te halen die in een identiteitskolom zijn ingevoegd, ziet u mogelijk dat deze functies soms onjuiste waarden retourneren. Het probleem treedt alleen op wanneer in uw query's parallelle uitvoeringsplannen worden gebruikt. Zie de sectie Intra-query parallelism in het volgende technische artikel over Microsoft Downloads voor meer informatie over het bepalen of uw query's parallelle uitvoeringsplannen gaan gebruiken:

Oorzaak

Microsoft heeft bevestigd dat dit probleem zich kan voordoen in de Microsoft-producten die aan het begin van dit artikel worden vermeld.

Oplossing

Cumulatieve updategegevens

SQL Server 2008 R2 Service Pack 1

De oplossing voor dit probleem is voor het eerst uitgebracht in Cumulatieve update 5 voor SQL Server 2008 R2 Service Pack 1. Klik op het volgende artikelnummer om het artikel in de Microsoft Knowledge Base te bekijken voor meer informatie over het verkrijgen van dit cumulatieve updatepakket: 

2659694Cumulatief updatepakket 5 voor SQL Server 2008 R2 Service Pack 1

Opmerking Omdat de builds cumulatief zijn, bevat elke nieuwe fix-release alle hotfixes en alle beveiligingsfixes die zijn opgenomen in de vorige SQL Server 2008 R2-fix-release. U wordt aangeraden de meest recente fix-release met dit hotfix toe te passen. Klik op het volgende artikelnummer in de Microsoft Knowledge Base voor meer informatie:

2567616De SQL Server 2008 R2-builds die zijn uitgebracht nadat SQL Server 2008 R2 Service Pack 1 is uitgebracht

Workaround

Microsoft raadt u aan geen van deze functies in uw query's te gebruiken wanneer er parallelle abonnementen bij betrokken zijn omdat ze niet altijd betrouwbaar zijn. Gebruik in plaats daarvan de OUTPUT-component van insert-instructie om de identiteitswaarde op te halen, zoals wordt weergegeven in het onderstaande voorbeeld.

Voorbeeld van het gebruik van de OUTPUT-component:

DECLARE @MYNEWIDENTITYVALUES tabel(myidvalues int) declaratie @A tabel (primaire id-int-sleutel) invoegen in @A waarden (1) declareer @B tabel (id int primary key identity(1,1), B int not null) invoegen in @B waarden (1) selecteren     [Rijtelling] = @@RowCount,     [@@IDENTITY] = @@IDENTITY,     [SCOPE_IDENTITY] = SCOPE_IDENTITY() statistiekenprofiel instellen op invoegen in _ddr_T uitvoer inserted.ID in @MyNewIdentityValues     selecteren             b.ID         uit @A een             left join @B b op b.ID = 1             left join @B b2 on b2. B = -1             left join _ddr_T t op t.T = -1         where not exists (select * from _ddr_T t2 where t2.ID = -1) statistiekenprofiel instellen selecteren     [Rijtelling] = @@RowCount,     [@@IDENTITY] = @@IDENTITY,     [SCOPE_IDENTITY] = SCOPE_IDENTITY(),     [IDENT_CURRENT] = IDENT_CURRENT('_ddr_T') selecteer * uit @MyNewIdentityValues gaan

Als u in uw situatie een van deze functies moet gebruiken, kunt u een van de volgende methoden gebruiken om het probleem te voorkomen.

Methode 1:

De volgende optie in de query opnemen

OPTION (MAXDOP 1)

Opmerking:Dit kan de prestaties van een SELECT-deel van de query beïnvloeden.

Methode 2:

Lees de waarde van het onderdeel SELECT in een set variabelen (of één tabelvariabele) en voeg vervolgens in de doeltabel in met MAXDOP=1. Aangezien het INSERT-plan niet parallel zal zijn, krijgt u de juiste semantische semantiek, maar uw SELECT zal parallel zijn om de gewenste prestaties te bereiken.

Methode 3:

Voer de volgende instructie uit om de maximale mate van parallelisme in te stellen op 1:

sp_configure 'max degree of parallelism', 1

gaan

opnieuw configureren met overschrijven

gaan

Opmerking:Deze methode kan leiden tot prestatiedegradatie op de server. U moet deze methode alleen gebruiken als u deze hebt geëvalueerd in een test- of faseringsomgeving.

Meer informatie

Microsoft Connect-bug op dithttps://docs.microsoft.com/en-us/collaborate/connect-redirect

Max Degree of Parallelism (MAXDOP)

Meer hulp nodig?

Meer opties?

Verken abonnementsvoordelen, blader door trainingscursussen, leer hoe u uw apparaat kunt beveiligen en meer.