KB2322209-FIX: onjuiste resultaten als u ronde haakjes gebruikt in een statement met een gemeenschappelijke tabelexpressie in SQL Server 2008

Symptomen

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

Scenario 1

U geeft een algemene tabelexpressie (CTE) op met behulp van de instructie WITH. Voer bijvoorbeeld de volgende query uit.

WITH common_table_expression AS (SELECT * FROM sys.objects)(SELECT * FROM common_table_expression)

Vervolgens voert u deze query uit.

SELECT *FROM sys.dm_exec_query_statsWHERE statement_start_offset > statement_end_offsetANDstatement_end_offset <> -1

In dit scenario wordt in het in de cache geplaatste queryplan voor deze query onjuiste statement_start_offset en statement_end_offset waarden opgeslagen. U merkt dat de statement_end_offset waarde kleiner is dan de waarde van statement_start_offset wanneer u sys.dm_exec_query_stats dynamische beheerweergave (DMV) uitvoert. Vanwege dit probleem kan een prestatierapport mislukt wanneer het rapport ervan uitgaat dat de statement_start_offset waarde altijd kleiner is dan de waarde van statement_stop_offset.

Scenario 2

U geeft een gemeenschappelijke tabelexpressie op met behulp van de instructie WITH en u gebruikt de optie RECOMPILE. U maakt bijvoorbeeld een functie in SQL Server 2008 met behulp van 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 query uitvoert op de optie dbo. function1 (), wordt het volgende foutbericht weergegeven:

Er is een ernstige fout opgetreden bij de huidige opdracht. Het resultaat, indien van toepassing, moet worden verwijderd.

Deze fout kan ook optreden zonder de optie opnieuw COMPILERen als de SQL-Server een intensief serververkeer heeft.

Scenario 3

U geeft een gemeenschappelijke tabelexpressie op met behulp van de instructie WITH. In de instructie met kunt u een tabel opgeven die niet bestaat. Voer bijvoorbeeld de volgende query uit.

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 er geen fout voor de ontbrekende tabel weergegeven.

Oorzaak

Deze problemen treden op vanwege een probleem met het verwerken van een SELECT-instructie die volgt op een statement. De instructie WITH gebruikt de volgende syntaxis.

WITH common_table_expression AS(CTE_query_definition)

Met deze instructie wordt een resultatenset gemaakt die is toegewezen aan de naam van de gemeenschappelijke tabelexpressie die is opgegeven. Vervolgens volgt u deze instructie met een SELECT-instructie. Als deze tweede instructie tussen haakjes staat, en u probeert een bewerking uit te voeren op de resultaten of om een sys.dm_exec_query_stats dynamische beheerweergave uit te voeren, krijgt u onjuiste resultaten of een foutmelding.

Oplossing

Informatie over service packs Download het meest recente Service Pack voor SQL Server 2008 om dit probleem op te lossen. Klik op het volgende artikelnummer in de Microsoft Knowledge Base voor meer informatie:

968382 Het nieuwste Service Pack voor SQL Server 2008

Workaround

U kunt deze problemen omzeilen door de haakjes te verwijderen van de statement na de gemeenschappelijke tabelexpressie. Kijk bijvoorbeeld naar het volgende voorbeeld met een dergelijke ronde haakjes.

WITH common_table_expression AS (SELECT *FROM sys.objects)(SELECT * FROM common_table_expression)

U kunt deze problemen omzeilen door de volgende opdracht te gebruiken met een statement die geen haakjes gebruikt.

WITH common_table_expression AS (SELECT *FROM sys.objects)SELECT * FROM common_table_expressio

Status

Microsoft heeft bevestigd dat dit een probleem is met de Microsoft-producten die worden vermeld in de sectie ' van toepassing op '. Dit probleem is voor het eerst gecorrigeerd in SQL Server 2008 Service Pack 2 (SP2).

Meer informatie

Ga naar de volgende webpagina van MSDN voor meer informatie over het gebruik van de instructie WITH met een gemeenschappelijke tabelexpressie:

MET common_table_expression (Transact-SQL)Ga voor meer informatie over sys.dm_exec_query_stats naar de volgende MSDN-webpagina:

sys.dm_exec_query_stats (Transact-SQL)

Meer hulp nodig?

Uw vaardigheden uitbreiden
Training verkennen
Als eerste nieuwe functies krijgen
Deelnemen aan Microsoft insiders

Was deze informatie nuttig?

Bedankt voor uw feedback.

×