Przejdź do głównej zawartości
Pomoc techniczna
Zaloguj się przy użyciu konta Microsoft
Zaloguj się lub utwórz konto.
Witaj,
Wybierz inne konto.
Masz wiele kont
Wybierz konto, za pomocą którego chcesz się zalogować.

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ą.

Czy te informacje były pomocne?

Jaka jest jakość języka?
Co wpłynęło na Twoje wrażenia?
Jeśli naciśniesz pozycję „Wyślij”, Twoja opinia zostanie użyta do ulepszania produktów i usług firmy Microsoft. Twój administrator IT będzie mógł gromadzić te dane. Oświadczenie o ochronie prywatności.

Dziękujemy za opinię!

×