Simptomi
Datorā, kurā darbojas sistēma Microsoft SQL Server 2008, apsveriet šādus scenārijus.
1. scenārijs
Varat norādīt vispārēju tabulas izteiksmi (CTE), izmantojot priekšrakstu WITH. Piemēram, palaidiet tālāk norādīto vaicājumu.
WITH common_table_expression AS (SELECT * FROM sys.objects)(SELECT * FROM common_table_expression)
Pēc tam palaidiet šo vaicājumu.
SELECT *FROM sys.dm_exec_query_statsWHERE statement_start_offset > statement_end_offsetANDstatement_end_offset <> -1
Šajā scenārijā šis vaicājuma kešotais vaicājumu plāns saglabā nepareizas statement_start_offset un statement_end_offset vērtības. Tieši jūs pamanīsit, ka statement_end_offset vērtība ir mazāka par statement_start_offset vērtību, palaižot sys.dm_exec_query_stats dinamiskās pārvaldības skatu (DMV). Šīs problēmas dēļ veiktspējas atskaite var neizdoties, ja atskaitē tiek pieņemts, ka statement_start_offset vērtība vienmēr ir mazāka par statement_stop_offset vērtību.
2. scenārijs
Varat norādīt vispārēju tabulas izteiksmi, izmantojot priekšrakstu WITH, un izmantot pārkompilēšanas opciju. Piemēram, varat izveidot funkciju SQL Server 2008, izmantojot tālāk norādīto skriptu.
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
Ja palaižat vaicājumu "Select dbo. function1 ()", tiek parādīts šāds kļūdas ziņojums:
Pašreizējā komandā radās nopietna kļūda. Rezultāti, ja tādi ir, ir jāizmet.
Turklāt šī kļūda var rasties arī bez pārkompilēšanas opcijas, ja SQL Server piedzīvo smago servera trafiku.
3. scenārijs
Varat norādīt vispārējas tabulas izteiksmi, izmantojot priekšrakstu WITH. Priekšrakstā WITH norādiet tabulu, kas nepastāv. Piemēram, palaidiet tālāk norādīto vaicājumu.
WITH computed_table (id) AS(SELECT id FROM this_table_does_not_exist) (SELECT id FROM dbo.computed_table) GO
Izpildot šo vaicājumu, trūkst kļūdas trūkstošajai tabulai.
Cēlonis
Šīs problēmas rodas, ja priekšraksta SELECT darbība ir nepareizas. Priekšraksts WITH izmanto šādu sintaksi.
WITH common_table_expression AS(CTE_query_definition)
Šis priekšraksts izveido rezultātu kopu, kas piešķirta biežāk lietotajam tabulas izteiksmes nosaukumam. Pēc tam šo priekšrakstu varat izpildīt, izmantojot priekšrakstu SELECT. Ja šis otrais priekšraksts ir ietverts iekavās un pēc tam mēģināt veikt darbības rezultātos vai mēģināt palaist sys.dm_exec_query_stats dinamiskās pārvaldības skatu, jūs saņemat nepareizus rezultātus vai kļūdas.
Risinājums
Informācija par servisa pakotni Lai atrisinātu šo problēmu, iegūstiet jaunāko SQL Server 2008 servisa pakotni. Lai iegūtu papildinformāciju, noklikšķiniet uz šī raksta numura, lai skatītu Microsoft zināšanu bāzes rakstu:
968382 Jaunākās SQL Server 2008 servisa pakotnes iegūšana
Risinājums
Lai novērstu šīs problēmas, ir jānoņem iekavas no priekšraksta, kas seko tipiskajai tabulas izteiksmei. Piemēram, apsveriet tālāk norādītās darbības ar priekšrakstiem, kas izmanto šādas iekavas.
WITH common_table_expression AS (SELECT *FROM sys.objects)(SELECT * FROM common_table_expression)
Lai novērstu šīs problēmas, veiciet tālāk norādītās darbības ar priekšrakstu, kas neizmanto šīs iekavas.
WITH common_table_expression AS (SELECT *FROM sys.objects)SELECT * FROM common_table_expressio
Statusa
Microsoft ir apstiprinājusi, ka šī problēma pastāv Microsoft produktos, kas ir norādīti sadaļā "attiecas uz". Šī problēma pirmo reizi tika labota SQL Server 2008 2. servisa pakotnē (SP2).
Papildinformācija
Lai iegūtu papildinformāciju, kā izmantot priekšrakstu WITH ar vispārēju tabulas izteiksmi, apmeklējiet šo MSDN tīmekļa lapu:
AR common_table_expression (Transact-SQL)Lai iegūtu papildinformāciju par sys.dm_exec_query_stats, apmeklējiet šo MSDN tīmekļa lapu: