Příznaky

Na počítači, na kterém běží Microsoft SQL Server 2008, zvažte následující scénáře.

Scénář 1

Pomocí příkazu WITH můžete určit výraz běžné tabulky (CTE). Spustíte například následující dotaz.

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

Potom tento dotaz spustíte.

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

V tomto scénáři obsahuje plán dotazů v mezipaměti pro tento dotaz nesprávné hodnoty statement_start_offset a statement_end_offset. Konkrétně si všimnete, že hodnota statement_end_offset je menší než hodnota statement_start_offset, když spustíte sys.dm_exec_query_stats dynamické zobrazení pro správu (DMV). Kvůli tomuto problému se může zpráva o výkonu zdařit, když sestava předpokládá, že hodnota statement_start_offset je vždycky menší než hodnota statement_stop_offset.

Scénář 2

Pomocí příkazu WITH můžete určit výraz běžné tabulky a použít možnost RECOMPILE. Můžete například vytvořit funkci na SQL serveru 2008 pomocí následujícího skriptu.

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

Při spuštění dotazu Select dbo. Function1 () se zobrazí následující chybová zpráva:

V aktuálním příkazu došlo k závažné chybě. Případné výsledky se zahodí.

K této chybě může navíc dojít bez možnosti RECOMPILE, pokud v systému SQL Server dochází k přetížení provozu serveru.

Scénář 3

Výraz WITH se používá pomocí příkazu WITH. V příkazu WITH zadejte tabulku, která neexistuje. Spustíte například následující dotaz.

WITH computed_table (id) AS(SELECT id FROM this_table_does_not_exist) (SELECT id FROM dbo.computed_table) GO

Po spuštění dotazu se nezobrazuje chyba chybějící tabulky.

Příčina

K těmto problémům dochází kvůli nefunkčnímu zpracování příkazu SELECT, který následuje za příkazem WITH. Příkaz WITH používá následující syntaxi.

WITH common_table_expression AS(CTE_query_definition)

Tento příkaz pak vytvoří sadu výsledků, která je přiřazená k zadanému názvu výrazu v běžné tabulce. Potom použijte tento příkaz příkaz SELECT. Pokud je druhý příkaz uzavřený v závorkách a Vy zkusíte provést operaci s výsledky nebo se pokusíte spustit sys.dm_exec_query_stats dynamické zobrazení pro správu, zobrazí se nesprávné výsledky nebo chyba.

Řešení

Informace o aktualizaci Service Pack Tento problém vyřešíte pomocí nejnovější aktualizace Service Pack pro SQL Server 2008. Další informace naleznete v následujícím článku znalostní báze Microsoft Knowledge Base:

968382 Jak získat nejnovější aktualizaci Service Pack pro SQL Server 2008

Alternativní řešení

Chcete-li tyto problémy vyřešit, musíte odebrat závorky z příkazu, který následuje za výrazem běžné tabulky. Předpokládejme například, že se jedná o příkaz, který používá tyto závorky.

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

Pokud chcete tento problém vyřešit, změňte následující příkaz pomocí příkazu, který tyto závorky nepoužívá.

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

Stav

Společnost Microsoft potvrzuje, že se jedná o problém v produktech této společnosti, které jsou uvedené v části "platí pro". Tento problém byl poprvé opraven v aktualizaci SQL Server 2008 Service Pack 2 (SP2).

Další informace

Další informace o použití příkazu WITH s výrazem Obecné tabulky najdete na následující webové stránce MSDN:

S common_table_expression (Transact-SQL)Další informace o sys.dm_exec_query_stats najdete na následující webové stránce MSDN:

sys.dm_exec_query_stats (Transact-SQL)

Potřebujete další pomoc?

Chcete další možnosti?

Prozkoumejte výhody předplatného, projděte si školicí kurzy, zjistěte, jak zabezpečit své zařízení a mnohem více.