Prisijunkite prie „Microsoft“
Prisijunkite arba sukurkite paskyrą.
Sveiki,
Pasirinkti kitą paskyrą.
Turite kelias paskyras
Pasirinkite paskyrą, kurią naudodami norite prisijungti.

Simptomai

Kai naudojate SCOPE_IDENTITY() arba @@IDENTITYfunkcijas, kad gautumėte į tapatybės stulpelį įterptas reikšmes, galite pastebėti, kad šios funkcijos kartais pateikia neteisingas reikšmes. Problema kyla tik tada, kai jūsų užklausos naudoja lygiagrečiai vykdyti planus. Daugiau informacijos, kaip nustatyti, ar jūsų užklausos ketina naudoti lygiagrečiai vykdyti planus, žr. skyrių Užklausų lygiagretumas šiame techninio straipsnio apie "Microsoft" atsisiuntimus:

Priežastis

"Microsoft" patvirtino, kad tai yra "Microsoft" produktų, išvardytų šio straipsnio pradžioje, problema.

Sprendimas

Kaupiamojo naujinimo informacija

"SQL Server 2008 R2" 1 pakeitimų paketas

Šios problemos pataisa pirmą kartą buvo išleista 5 kaupiamajame naujinime, skirtame "SQL Server 2008 R2" 1 pakeitimų paketui. Jei norite gauti daugiau informacijos apie tai, kaip gauti šį kaupiamųjų naujinimų paketą, spustelėkite toliau nurodytą straipsnio numerį ir peržiūrėkite "Microsoft" žinių bazės straipsnį: 

2659694"SQL Server 2008 R2" 1 pakeitimų paketo 5 kaupiamųjų naujinimų paketas

Pastaba. Kadangi komponavimo versijos yra sukauptos, kiekvienoje naujoje pataisų versijoje yra visos karštosios pataisos ir visos saugos pataisos, kurios buvo įtrauktos į ankstesnį "SQL Server 2008 R2" pataisų leidimą. Rekomenduojame taikyti naujausią pataisų leidimą, kuriame yra šios karštosios pataisos. Jei reikia daugiau informacijos, spustelėkite toliau nurodytą straipsnio numerį ir peržiūrėkite "Microsoft" žinių bazės straipsnį:

2567616"SQL Server 2008 R2" komponavimo versijos, išleistos po to, kai buvo išleistas "SQL Server 2008 R2" 1 pakeitimų paketas

Sprendimas

"Microsoft" rekomenduoja nenaudokite šių funkcijų užklausose, kai dalyvauja lygiagretūs planai, nes jie ne visada patikimi. Vietoj to naudokite sakinį INSERT sąlygą OUTPUT, kad gautumėte tapatybės reikšmę, kaip parodyta toliau pateiktame pavyzdyje.

Sąlygos OUTPUT naudojimo pavyzdys:

DECLARE @MyNewIdentityValues table(myidvalues int)
paskelbti @A lentelę (ID int pirminis raktas)
įterpti į @A reikšmes (1)
paskelbti @B lentelę (ID int pirminio rakto tapatybė(1,1), B int not null)
įterpti į @B reikšmes (1)
pasirinkite
    [RowCount] = @@RowCount,
    [@@IDENTITY] = @@IDENTITY,
    [SCOPE_IDENTITY] = SCOPE_IDENTITY()

nustatyti statistikos profilį
įterpti į _ddr_T
išvesties inserted.ID į @MyNewIdentityValues
    pasirinkite
            
b.ID         iš @A a
            left join @B b on b.ID = 1
            kairiuoju @B b2 b2. B = -1

            left join _ddr_T t on t.T = -1

        kur nėra (pasirinkite * iš _ddr_T t2, kur t2.ID = -1)
statistikos profilio išjungimas

pasirinkite
    [RowCount] = @@RowCount,
    [@@IDENTITY] = @@IDENTITY,
    [SCOPE_IDENTITY] = SCOPE_IDENTITY(),
    [IDENT_CURRENT] = IDENT_CURRENT('_ddr_T')
pasirinkite * iš @MyNewIdentityValues
eiti

Jei jūsų situacija reikalauja, kad jums reikia naudoti vieną iš šių funkcijų, galite naudoti vieną iš toliau nurodytų būdų problemai išspręsti.

1 būdas:

Įtraukite šią parinktį į užklausą

OPTION (MAXDOP 1)

Pastaba:tai gali pakenkti užklausos SELECT dalies našumui.

2 būdas:

Perskaitykite reikšmę iš SELECT dalies į kintamųjų rinkinį (arba vieną lentelės kintamąjį), tada įterpkite į tikslinę lentelę su MAXDOP=1. Kadangi INSERT planas nebus lygiagretus, gausite tinkamą semantinį, tačiau jūsų SELECT bus lygiagretus, kad būtų pasiektas pageidaujamas našumas.

3 būdas:

Vykdykite šį sakinį, kad nustatykite maksimalų lygiagretumo laipsnį kaip 1:

sp_configure 'maksimalus lygiagretumo laipsnis', 1

eiti

perkonfigūruoti su perrašymu

eiti

Pastaba:šis metodas gali sukelti serveryje našumo blogėjimą. Šio metodo naudoti negalima, nebent esate jį įvertinę testavimo arba sustojimo aplinkoje.

Daugiau informacijos

"Microsoft Connect" klaida dėl šioshttps://docs.microsoft.com/en-us/collaborate/connect-redirect

Maksimalus lygiagretumo laipsnis (MAXDOP)https://msdn.microsoft.com/en-us/library/ms181007.aspx

Reikia daugiau pagalbos?

Norite daugiau parinkčių?

Sužinokite apie prenumeratos pranašumus, peržiūrėkite mokymo kursus, sužinokite, kaip apsaugoti savo įrenginį ir kt.

Bendruomenės padeda užduoti klausimus ir į juos atsakyti, pateikti atsiliepimų ir išgirsti iš ekspertų, turinčių daug žinių.

Ar ši informacija buvo naudinga?

Ar esate patenkinti kalbos kokybe?
Kas turėjo įtakos jūsų įspūdžiams?
Paspaudus mygtuką Pateikti, jūsų atsiliepimai bus naudojami tobulinant „Microsoft“ produktus ir paslaugas. Jūsų IT administratorius galės rinkti šiuos duomenis. Privatumo patvirtinimas.

Dėkojame už jūsų atsiliepimą!

×