Symptom
På en dator som kör Microsoft SQL Server 2008 bör du tänka på följande:
Scenario 1
Du anger ett vanligt tabell uttryck (CTE) genom att använda WITH-satsen. Du kör till exempel följande fråga.
WITH common_table_expression AS (SELECT * FROM sys.objects)(SELECT * FROM common_table_expression)
Sedan kör du den här frågan.
SELECT *FROM sys.dm_exec_query_statsWHERE statement_start_offset > statement_end_offsetANDstatement_end_offset <> -1
I det här scenariot lagrar det cachelagrade frågeuttrycket för den här frågan Felaktiga statement_start_offset och statement_end_offset värden. Observera att statement_end_offset svärdet är mindre än det statement_start_offset svärdet när du kör sys.dm_exec_query_stats Dynamic Management View (DMV). På grund av det här problemet kan en prestanda rapport Miss lyckas när rapporten antar att statement_start_offset svärdet alltid är mindre än värdet för statement_stop_offset.
Scenario 2
Du anger ett vanligt tabell uttryck med hjälp av WITH-satsen och använder alternativet för att kompilera om. Du kan till exempel skapa en funktion i SQL Server 2008 med hjälp av följande skript.
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
När du kör frågan "Select dbo. function1 ()" visas följande fel meddelande:
Ett allvarligt fel inträffade för det aktuella kommandot. Eventuella resultat ska ignoreras.
Dessutom kan det här felet uppstå utan omkompilering om SQL Server har stor server trafik.
Scenario 3
Du anger ett vanligt tabell uttryck med WITH-satsen. I WITH-satsen anger du en tabell som inte finns. Du kör till exempel följande fråga.
WITH computed_table (id) AS(SELECT id FROM this_table_does_not_exist) (SELECT id FROM dbo.computed_table) GO
När du kör den här frågan får du inget fel meddelande för den saknade tabellen.
Orsak
De här problemen uppstår på grund av en felaktig bearbetning av ett SELECT-uttryck som följer med-instruktionen. MED-satsen används följande syntax.
WITH common_table_expression AS(CTE_query_definition)
Den här policyn skapar sedan en resultat uppsättning som är tilldelad till det vanliga tabell uttrycks namnet som du har angett. Sedan följer du den här policyn med ett SELECT-uttryck. Om den andra instruktionen omges av parenteser och sedan försöker utföra en åtgärd på resultatet eller försöker köra en sys.dm_exec_query_stats dynamisk management-vy får du felaktiga resultat eller ett fel.
Lösning
Information om Service Pack Lös problemet genom att hämta senaste Service Pack för SQL Server 2008. Om du vill veta mer klickar du på följande artikelnummer och läser artikeln i Microsoft Knowledge Base:
968382 Skaffa den senaste Service Pack-versionen för SQL Server 2008
Lösning
Om du vill undvika de här problemen måste du ta bort parenteserna från uttrycket som följer det vanliga tabell uttrycket. Överväg till exempel följande med uttryck som använder sådana parenteser.
WITH common_table_expression AS (SELECT *FROM sys.objects)(SELECT * FROM common_table_expression)
Undvik de här problemen genom att ändra till följande med-uttryck som inte använder dessa parenteser.
WITH common_table_expression AS (SELECT *FROM sys.objects)SELECT * FROM common_table_expressio
Status
Microsoft har bekräftat att det här är ett problem i Microsoft-produkterna som nämns i "gäller". Det här problemet åtgärdades först i SQL Server 2008 Service Pack 2 (SP2).
Mer information
Mer information om hur du använder WITH-satsen med ett gemensamt tabell uttryck finns på följande MSDN-webb sida:
MED common_table_expression (Transact-SQL)Mer information om sys.dm_exec_query_stats finns på följande MSDN-webb sida: