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: