Simptomai
Kompiuteryje, kuriame veikia "Microsoft SQL Server" 2008, Apsvarstykite šiuos scenarijus.
1 scenarijus
Galite nurodyti bendrą lentelės reiškinį (CTE) naudodami sakinį WITH. Pvz., vykdote šią užklausą.
WITH common_table_expression AS (SELECT * FROM sys.objects)(SELECT * FROM common_table_expression)
Tada vykdykite šią užklausą.
SELECT *FROM sys.dm_exec_query_statsWHERE statement_start_offset > statement_end_offsetANDstatement_end_offset <> -1
Pagal šį scenarijų talpyklos užklausos planas šiai užklausai saugo neteisingus statement_start_offset ir statement_end_offset reikšmes. Tiksliau sakant, pastebite, kad statement_end_offset reikšmė yra mažesnė nei statement_start_offset reikšmė, kai paleidžiate sys.dm_exec_query_stats dinaminio valdymo rodinį (DMV). Dėl šios problemos našumo ataskaita gali nepavykti, jei ataskaitoje manoma, kad statement_start_offset reikšmė visada yra mažesnė už statement_stop_offset reikšmę.
2 scenarijus
Galite nurodyti bendrą lentelės reiškinį naudodami sakinį WITH ir naudokite funkciją PERKOMPILIUOTI. Pvz., "SQL Server 2008" sukuriate funkciją naudodami šį scenarijų.
CREATE FUNCTION function1() RETURNS int ASBEGINDECLARE @x intSET @x=1;WITH common_table_expression AS (SELECT @x AS column1) (SELECT @x=column1 FROM common_table_expression) OPTION(RECOMPILE)RETURN @xEND
Kai vykdote užklausą "pasirinkite dbo. function1 ()", gaunate šį klaidos pranešimą:
Dabartinėje komandoje įvyko rimta klaida. Rezultatai, jei jų yra, turi būti šalinami.
Be to, ši klaida gali įvykti be PERKOMPILIAVIMO parinkties, jei SQL serveris patiria sunkių serverių srautą.
3 scenarijus
Galite nurodyti bendrą lentelės reiškinį naudodami sakinį WITH. Sakinyje WITH galite nurodyti lentelę, kurios nėra. Pvz., vykdote šią užklausą.
WITH computed_table (id) AS(SELECT id FROM this_table_does_not_exist) (SELECT id FROM dbo.computed_table) GO
Kai vykdote šią užklausą, negausite klaidos dėl trūkstamos lentelės.
Priežastis
Šios problemos kyla dėl netinkamo sakinio, kuris atitinka sakinį, apdorojimo. Sakinys WITH naudoja šią sintaksę.
WITH common_table_expression AS(CTE_query_definition)
Šis sakinys sukuria rezultatų rinkinį, priskirtą įprastam lentelės reiškinio pavadinimui, kuris buvo nurodytas. Tada vykdykite šį sakinį naudodami sakinį SELECT. Jei antrasis sakinys yra skliaustuose, tada bandote atlikti veiksmo rezultatus arba bandote paleisti sys.dm_exec_query_stats dinaminio valdymo rodinį, gaunate neteisingus rezultatus arba klaidą.
Sprendimas
Paslaugų paketo informacija Norėdami išspręsti šią problemą, Įsigykite naujausią "SQL Server 2008" pakeitimų paketą. Jei reikia daugiau informacijos, spustelėkite toliau esantį straipsnio numerį ir peržiūrėkite straipsnį "Microsoft" žinių bazėje:
968382 Kaip įsigyti naujausią "SQL Server 2008" pakeitimų paketą
Sprendimas
Norėdami išspręsti šias problemas, turite pašalinti skliaustus iš teiginio, kuris atitinka bendrą lentelės reiškinį. Pavyzdžiui, atsižvelkite į šiuos skliaustus, naudodami sakinį.
WITH common_table_expression AS (SELECT *FROM sys.objects)(SELECT * FROM common_table_expression)
Norėdami išspręsti šias problemas, atlikite toliau nurodytus veiksmus, naudodami sakinį, kuris nenaudoja šių skliaustelių.
WITH common_table_expression AS (SELECT *FROM sys.objects)SELECT * FROM common_table_expressio
Statusą
"Microsoft" patvirtino, kad tai yra "Microsoft" produktų, išvardytų skyriuje "taikoma", problema. Ši problema pirmą kartą ištaisyta SQL serverio 2008 2 pakeitimų pakete (SP2).
Daugiau informacijos
Daugiau informacijos apie tai, kaip naudoti sakinį su bendrosios lentelės išraiška, rasite apsilankę šioje MSDN svetainėje:
SU common_table_expression (Transact-SQL)Jei norite gauti daugiau informacijos apie sys.dm_exec_query_stats, apsilankykite šioje MSDN svetainėje: