Symptomy
Na komputerze, na którym jest uruchomiony program Microsoft SQL Server 2008, należy uwzględnić następujące scenariusze.
Scenariusz 1
Do określenia wspólnego wyrażenia tabeli (CTE) służy instrukcja WITH. Na przykład uruchom następujące zapytanie.
WITH common_table_expression AS (SELECT * FROM sys.objects)(SELECT * FROM common_table_expression)
Następnie Uruchom to zapytanie.
SELECT *FROM sys.dm_exec_query_statsWHERE statement_start_offset > statement_end_offsetANDstatement_end_offset <> -1
W tym scenariuszu w buforowanym planie zapytań dla tego zapytania są przechowywane niepoprawne wartości statement_start_offset i statement_end_offset. W szczególności zauważysz, że wartość statement_end_offset jest mniejsza niż wartość statement_start_offset po uruchomieniu sys.dm_exec_query_stats dynamicznym widoku zarządzania (DMV). Z powodu tego problemu raport wydajności może się nie powieść, gdy raport przyjmie, że wartość statement_start_offset jest zawsze mniejsza niż wartość statement_stop_offset.
Scenariusz 2
Typowe wyrażenie tabeli można określić za pomocą instrukcji WITH, a następnie użyto opcji RECOMPILE. Na przykład w programie SQL Server 2008 można utworzyć odpowiednią pozycję za pomocą poniższego skryptu.
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
Po uruchomieniu zapytania "Select dbo. function1 ()" jest wyświetlany następujący komunikat o błędzie:
W bieżącym poleceniu wystąpił poważny błąd. Ewentualne wyniki należy odrzucić.
Ponadto ten błąd może wystąpić bez opcji ponownej kompilacji, jeśli w programie SQL Server wystąpił duży ruch serwera.
Scenariusz 3
Typowe wyrażenie tabeli można określić przy użyciu instrukcji WITH. W instrukcji WITH jest określana tabela, która nie istnieje. Na przykład uruchom następujące zapytanie.
WITH computed_table (id) AS(SELECT id FROM this_table_does_not_exist) (SELECT id FROM dbo.computed_table) GO
Po uruchomieniu tego zapytania nie jest wyświetlany błąd dotyczący brakującej tabeli.
Przyczyna
Te problemy występują z powodu nieprawidłowego przetwarzania instrukcji SELECT, która następuje po instrukcji WITH. Instrukcja WITH używa następującej składni.
WITH common_table_expression AS(CTE_query_definition)
Ta instrukcja powoduje utworzenie zestawu wyników przypisanego do określonej nazwy pospolitej wyrażenia tabeli. Następnie należy postępować zgodnie z tą instrukcją za pomocą instrukcji SELECT. Jeśli ta druga instrukcja jest ujęta w nawiasy, a następnie spróbujesz wykonać operację na wynikach lub spróbujesz uruchomić sys.dm_exec_query_stats dynamicznym widoku zarządzania, otrzymujesz niepoprawne wyniki lub błąd.
Rozwiązanie
Informacje o dodatku Service Pack Aby rozwiązać ten problem, Uzyskaj najnowszy dodatek Service Pack dla programu SQL Server 2008. Aby uzyskać więcej informacji, kliknij następujący numer artykułu w celu wyświetlenia tego artykułu z bazy wiedzy Microsoft Knowledge Base:
968382 Jak uzyskać najnowszy dodatek Service Pack dla programu SQL Server 2008
Obejście
Aby obejść te problemy, należy usunąć nawiasy z instrukcji znajdującej się za wspólnym wyrażeniem tabeli. Na przykład w instrukcji używającej takich nawiasów należy uwzględnić następujące instrukcje.
WITH common_table_expression AS (SELECT *FROM sys.objects)(SELECT * FROM common_table_expression)
Aby obejść te problemy, przejdź do instrukcji, która nie korzysta z tych nawiasów.
WITH common_table_expression AS (SELECT *FROM sys.objects)SELECT * FROM common_table_expressio
Stan
Firma Microsoft potwierdziła, że jest to problem występujący w produktach firmy Microsoft wymienionych w sekcji "dotyczy". Ten problem został po raz pierwszy rozwiązany w dodatku Service Pack 2 (SP2) dla programu SQL Server 2008.
Więcej informacji
Aby uzyskać więcej informacji na temat używania instrukcji WITH ze wspólnym wyrażeniem tabeli, odwiedź następującą stronę sieci Web MSDN:
Z common_table_expression (Transact-SQL)Aby uzyskać więcej informacji na temat sys.dm_exec_query_stats, odwiedź następującą stronę sieci Web MSDN: