FIX: Onjuiste resultaten als u haakjes rond selecteren in een instructie met een in SQL Server 2008


Symptomen


Op een computer waarop Microsoft SQL Server 2008 wordt uitgevoerd, kunt u overwegen de volgende scenario's.

Scenario 1

U kunt algemene tabelexpressie (CTE) opgeven met behulp van de instructie WITH. Bijvoorbeeld, kunt u de volgende query uitvoeren.
WITH common_table_expression AS (SELECT * FROM sys.objects)(SELECT * FROM common_table_expression)
Vervolgens kunt u de query uitvoert.
SELECT *FROM sys.dm_exec_query_statsWHERE statement_start_offset > statement_end_offsetANDstatement_end_offset <> -1
In dit scenario wordt het queryplan in cache opgeslagen voor deze query opgeslagen onjuiste statement_start_offset en statement_end_offset-waarden. U ziet de statement_end_offset waarde kleiner is dan de waarde van statement_start_offset bij het uitvoeren van sys.dm_exec_query_stats beheer van dynamische weergave (DMV). Vanwege dit probleem mislukt een prestatierapport wanneer het rapport wordt ervan uitgegaan dat de waarde statement_start_offset is altijd kleiner dan de waarde van statement_stop_offset.

Scenario 2

U een algemene tabelexpressie opgeven met behulp van de instructie WITH en u gebruikt de optie opnieuw COMPILEREN. Bijvoorbeeld, u een functie in SQL Server 2008 met het volgende script.
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
Wanneer u een 'select dbo.function1()' query uitvoert, wordt het volgende foutbericht weergegeven:
Er is een ernstige fout opgetreden op de huidige opdracht. De resultaten, moeten indien aanwezig, worden genegeerd.
Deze fout kan ook optreden zonder de optie opnieuw COMPILEREN als de SQL-server een druk serververkeer heeft.

Scenario 3

U kunt een algemene tabelexpressie opgeven met behulp van de instructie WITH. In de instructie WITH geeft u een tabel die niet bestaat. Bijvoorbeeld, kunt u de volgende query uitvoeren.
WITH computed_table (id) AS(SELECT id FROM this_table_does_not_exist) (SELECT id FROM dbo.computed_table) GO
Wanneer u deze query uitvoert, wordt een fout voor de ontbrekende tabel niet wordt.

Oorzaak


Deze problemen treden op vanwege een slecht functionerende verwerking van een SELECT-instructie die volgt op een WITH-instructie. De instructie met de volgende syntaxis gebruikt.
WITH common_table_expression AS(CTE_query_definition)
Vervolgens deze instructie maakt u een resultaatset die is toegewezen aan een algemene expressie naam van de tabel die is opgegeven. Volg vervolgens deze verklaring met een SELECT-instructie. Als u deze tweede instructie staat tussen haakjes, u wilt een bewerking uitvoeren op de resultaten of uitvoeren van een sys.dm_exec_query_stats beheer van dynamische weergave, krijgt u onjuiste resultaten of een fout.

Oplossing


Informatie over het service packU lost dit probleem, het meest recente servicepack voor SQL Server 2008 te verkrijgen. Klik op het volgende artikelnummer in de Microsoft Knowledge Base voor meer informatie:
968382 Het verkrijgen van het meest recente servicepack voor SQL Server 2008

Workaround


U kunt deze problemen omzeilen, moet u de haakjes van de instructie die volgt op de algemene tabelexpressie verwijderen. Neem bijvoorbeeld de volgende met de instructie die dergelijke haakjes gebruikt.
WITH common_table_expression AS (SELECT *FROM sys.objects)(SELECT * FROM common_table_expression)
U kunt deze problemen omzeilen, wijzigen in de volgende met de instructie die geen van deze tussen haakjes gebruikmaakt.
WITH common_table_expression AS (SELECT *FROM sys.objects)SELECT * FROM common_table_expressio

Status


Microsoft heeft bevestigd dat dit probleem kan optreden in de Microsoft-producten die worden vermeld in de sectie 'Van toepassing op'. Dit probleem werd voor het eerst verholpen in SQL Server 2008 Service Pack 2 (SP2).

Meer informatie


Ga naar de volgende MSDN-webpagina voor meer informatie over het gebruik van de instructie WITH met een algemene tabelexpressie:Ga naar de volgende MSDN-webpagina voor meer informatie over sys.dm_exec_query_stats: