KB2322209: fehlerhafte Ergebnisse bei Verwendung von Klammern um SELECT in einer Anweisung mit einem allgemeinen Tabellenausdruck in SQL Server 2008


Problembeschreibung


Nehmen Sie auf einem Computer, auf dem Microsoft SQL Server 2008 ausgeführt wird, die folgenden Szenarien in Frage.

Szenario 1

Sie geben einen allgemeinen Tabellenausdruck (CTE) an, indem Sie die with-Anweisung verwenden. Führen Sie beispielsweise die folgende Abfrage aus.
WITH common_table_expression AS (SELECT * FROM sys.objects)(SELECT * FROM common_table_expression)
Führen Sie dann diese Abfrage aus.
SELECT *FROM sys.dm_exec_query_statsWHERE statement_start_offset > statement_end_offsetANDstatement_end_offset <> -1
In diesem Szenario speichert der zwischengespeicherte Abfrageplan für diese Abfrage falsche statement_start_offset-und statement_end_offset Werte. Insbesondere beachten Sie, dass der statement_end_offset-Wert kleiner als der statement_start_offset Wert ist, wenn Sie sys.dm_exec_query_stats Dynamic Management View (DMV) ausführen. Aufgrund dieses Problems kann ein Leistungsbericht fehlschlagen, wenn im Bericht davon ausgegangen wird, dass der statement_start_offset Wert immer kleiner als der statement_stop_offset Wert ist.

Szenario 2

Sie geben einen allgemeinen Tabellenausdruck mithilfe der with-Anweisung an, und Sie verwenden die Option kompilieren. Beispielsweise erstellen Sie eine Funktion in SQL Server 2008 mithilfe des folgenden Skripts.
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
Wenn Sie eine "SELECT dbo. function1 ()"-Abfrage ausführen, wird die folgende Fehlermeldung angezeigt:
Für den aktuellen Befehl ist ein schwerwiegender Fehler aufgetreten. Die Ergebnisse, falls vorhanden, sollten verworfen werden.
Darüber hinaus kann dieser Fehler ohne die Option zum erneuten Kompilieren auftreten, wenn der Server Datenverkehr in SQL Server stark belastet wird.

Szenario 3

Sie geben einen allgemeinen Tabellenausdruck an, indem Sie die with-Anweisung verwenden. In der with-Anweisung geben Sie eine Tabelle an, die nicht vorhanden ist. Führen Sie beispielsweise die folgende Abfrage aus.
WITH computed_table (id) AS(SELECT id FROM this_table_does_not_exist) (SELECT id FROM dbo.computed_table) GO
Wenn Sie diese Abfrage ausführen, erhalten Sie keinen Fehler für die fehlende Tabelle.

Ursache


Diese Probleme treten aufgrund einer fehlerhaften Verarbeitung einer SELECT-Anweisung auf, die einer with-Anweisung folgt. Die with-Anweisung verwendet die folgende Syntax.
WITH common_table_expression AS(CTE_query_definition)
Diese Anweisung erstellt dann eine Ergebnismenge, die dem angegebenen allgemeinen Tabellenausdrucks Namen zugewiesen ist. Anschließend folgen Sie dieser Anweisung mit einer SELECT-Anweisung. Wenn diese zweite Anweisung in Klammern eingeschlossen ist und Sie versuchen, eine Operation für die Ergebnisse auszuführen, oder wenn Sie versuchen, eine sys.dm_exec_query_stats dynamische Verwaltungsansicht auszuführen, erhalten Sie falsche Ergebnisse oder einen Fehler.

Fehlerbehebung


Service Pack-Informationen Um dieses Problem zu beheben, besorgen Sie sich das neueste Service Pack für SQL Server 2008. Weitere Informationen finden Sie im folgenden Artikel der Microsoft Knowledge Base:
968382 So erhalten Sie das neueste Service Pack für SQL Server 2008

Problemumgehung


Um diese Probleme zu umgehen, müssen Sie die Klammern aus der Anweisung entfernen, die dem allgemeinen Tabellenausdruck folgt. Nehmen Sie beispielsweise die folgende with-Anweisung in Frage, die solche Klammern verwendet.
WITH common_table_expression AS (SELECT *FROM sys.objects)(SELECT * FROM common_table_expression)
Um diese Probleme zu umgehen, ändern Sie die folgende with-Anweisung, die diese Klammern nicht verwendet.
WITH common_table_expression AS (SELECT *FROM sys.objects)SELECT * FROM common_table_expressio

Status


Microsoft hat bestätigt, dass es sich um ein Problem mit den Microsoft-Produkten handelt, die im Abschnitt "gilt für" aufgeführt sind. Dieses Problem wurde zuerst in SQL Server 2008 Service Pack 2 (SP2) behoben.

Weitere Informationen


Weitere Informationen zum Verwenden der with-Anweisung mit einem allgemeinen Tabellenausdruck finden Sie auf der folgenden MSDN-Website:Weitere Informationen zu sys.dm_exec_query_stats finden Sie auf der folgenden MSDN-Website: