KB2380435 - FIX: salvestatud protseduuri päringuplaani ei talletata vahemällu, kui salvestatud protseduur kasutab muutujat BLOB ja muutujat kasutatakse Microsoft SQL Server 2008 stringifunktsioonis või Microsoft SQL Server 2008 R2

Rakenduskoht
SQL Server 2008 SQL Server 2008 R2

Microsoft levitab Microsoft SQL Server 2008 ja Microsoft SQL Server 2008 R2 parandusi ühe allalaaditava failina. Kuna parandused on kumulatiivsed, sisaldab iga uus väljaanne kõiki kiirparandusi ja kõiki turbeparandusi, mis olid kaasatud eelmise SQL Server 2008 või SQL Server 2008 R2 parandus välja.

Sümptomid

Vaatame järgmist näidet.

  • Salvestatud protseduuri saate luua microsoft SQL Server 2008 või Microsoft SQL Server 2008 R2.
  • Salvestatud protseduur kasutab kahendmuutujat (BLOB).
  • Muutujat BLOB kasutatakse stringifunktsioonis.
  • Käivitate salvestatud protseduuri.

Selle stsenaariumi puhul pole salvestatud protseduuri päringuplaan vahemällu talletatud.

Lahendus

Koondvärskenduse teave

SQL Server 2008 Service Pack 1

Selle probleemi lahendus anti esimest korda välja koondvärskenduses 10 SQL Server 2008 hoolduspaketi Service Pack 1 jaoks. Selle koondvärskenduspaketi kohta lisateabe saamiseks klõpsake Microsofti teabebaasi artikli kuvamiseks järgmist artiklinumbrit:

2279604 koondvärskenduse pakett 10 SQL Server 2008 Service Pack 1Note' jaoks Kuna järgud on kumulatiivsed, sisaldab iga uus parandus väljaanne kõiki kiirparandusi ja kõiki turbeparandusi, mis olid kaasatud eelmises SQL Server 2008 paranduse väljaandes. Microsoft soovitab teil kaaluda uusima paranduse väljaandmist, mis sisaldab seda kiirparandust. Microsofti teabebaasis oleva artikli kuvamiseks klõpsake järgmist artiklinumbrit.

970365 Pärast SQL Server 2008 hoolduspaketi Service Pack 1 väljaandmist SQL Server välja antud SQL Server 2008 kiirparandusi luuakse konkreetsete SQL Server hoolduspakettide jaoks. SQL Server 2008 hoolduspaketi Service Pack 1 installimiseks peate rakendama SQL Server 2008 hoolduspaketi Service Pack 1. Vaikimisi kaasatakse SQL Server hoolduspaketis olev kiirparandus järgmisesse SQL Server hoolduspaketti.

SQL Server 2008 Service Pack 2

Selle probleemi lahendus anti esimest korda välja koondvärskenduses 1 SQL Server 2008 hoolduspaketi Service Pack 2 jaoks. Selle koondvärskenduspaketi kohta lisateabe saamiseks klõpsake Microsofti teabebaasi artikli kuvamiseks järgmist artiklinumbrit:

2289254 SQL Server 2008 Service Pack 2Note koondvärskendus 1 Kuna järgud on kumulatiivsed, sisaldab iga uus parandusväljaanne kõiki kiirparandusi ja kõiki turbeparandusi, mis olid kaasatud eelmises SQL Server 2008 paranduse väljaandes. Soovitame teil kaaluda viimase paranduse väljaandmist, mis sisaldab seda kiirparandust. Microsofti teabebaasis oleva artikli kuvamiseks klõpsake järgmist artiklinumbrit.

2402659 Pärast SQL Server 2008 hoolduspaketi Service Pack 2 väljaandmist välja antud SQL Server 2008 järgud

SQL Server 2008 R2

Selle probleemi lahendus anti esimest korda välja koondvärskenduses 4. Lisateavet selle koondvärskenduspaketi hankimise kohta SQL Server 2008 R2 jaoks klõpsake Microsofti teabebaasi artikli kuvamiseks järgmist artiklinumbrit:

2345451 koondvärskenduse pakett 4 SQL Server 2008 R2 märkus Kuna järgud on kumulatiivsed, iga uus parandus välja kõik kiirparandused ja kõik turbeparandused, mis olid kaasatud eelmises SQL Server 2008 R2 paranduse väljaandes. Soovitame teil kaaluda viimase paranduse väljaandmist, mis sisaldab seda kiirparandust. Microsofti teabebaasis oleva artikli kuvamiseks klõpsake järgmist artiklinumbrit.

981356 Pärast SQL Server 2008 R2 väljaandmist välja antud SQL Server 2008 R2 järgud

Olek

Microsoft on kinnitanud, et see on jaotises „Rakenduskoht“ loetletud Microsofti toodete korral esinev probleem.

Veel teavet

Selle probleemi taastekitamiseks tehke järgmist.

  1. Kahe salvestatud protseduuri ("p_test1" ja "p_test2") loomiseks käivitage järgmine kood. "P_test1" kasutab muutujat BLOB ja "p_test2" kasutab muutujat nvarchar(100).use tempdb
    mine
    kui OBJECT_ID('p_test1') pole tühi drop proc p_test1
    kui OBJECT_ID('p_test2') pole tühi drop proc p_test2
    mine
    create proc p_test1
    @s nvarchar(max)
    kui
    alustamine
    select * from sys.objects
    kus nimi = UPPER(@s)
    end
    mine
    create proc p_test2
    @s nvarchar(100)
    kui
    alustamine
    select * from sys.objects
    kus nimi = UPPER(@s)
    end
    mine

  2. Protseduuri vahemälu tühjendamiseks ja kahe salvestatud protseduuri käivitamiseks käivitage järgmine kood:dbcc freeproccache
    mine
    exec p_test1 N'abc'
    exec p_test2 N'abc'
    mine

  3. Käivitage vahemälulepingu kontrollimiseks järgmine kood: valige object_name(CONVERT(int, a.value)), cp.*
    alates sys.dm_exec_cached_plans cp
    cross apply sys.dm_exec_plan_attributes(cp.plan_handle) a
    kus cp.objtype = 'Proc'
    ja a.attribute = 'objectid'

Märkus. Kui Microsoft SQL Server 2008 või Microsoft SQL Server 2008 R2 eksemplaris on selliseid samaaegseid toiminguid, võib eksemplari kompileerimislukkude tõttu ilmneda blokeerimine.

Kompileerimislukkude põhjustatud SQL Server blokeerimise kirjelduse kohta leiate lisateavet järgmisest Microsofti teabebaasi artiklist:

263889 Kompileerimislukkudest põhjustatud SQL Server blokeerimise kirjeldus

Viited

Stringifunktsioonide (Transact-SQL) kohta lisateabe saamiseks külastage järgmist Microsofti veebisaiti:

Stringifunktsioonid (Transact-SQL) SQL Server inkrementaalteenuse mudeli kohta lisateabe saamiseks klõpsake Microsofti teabebaasis oleva artikli kuvamiseks järgmist artiklinumbrit.

935897 SQL Server meeskonnalt on saadaval astmeline teenindusmudel teatatud probleemide kiirparanduste tegemiseks

SQL Server värskenduste nimetamisskeemi kohta lisateabe saamiseks klõpsake Microsofti teabebaasis oleva artikli kuvamiseks järgmist artiklinumbrit.

822499 Microsofti SQL Server tarkvaravärskenduspakettide uus nimeskeemTarkvaravärskenduste terminoloogia kohta lisateabe saamiseks klõpsake Microsofti teabebaasi artikli kuvamiseks järgmist artiklinumbrit:

824684 Microsofti tarkvaravärskenduste kirjeldamiseks kasutatava standardterminite kirjeldus