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:

sys.dm_exec_query_stats (Transact-SQL)

Potrzebujesz dalszej pomocy?

Chcesz uzyskać więcej opcji?

Poznaj korzyści z subskrypcji, przeglądaj kursy szkoleniowe, dowiedz się, jak zabezpieczyć urządzenie i nie tylko.

Społeczności pomagają zadawać i odpowiadać na pytania, przekazywać opinie i słuchać ekspertów z bogatą wiedzą.