Príznaky
V počítači so spustenou službou Microsoft SQL Server 2008 zvážte nasledujúce scenáre.
Scenár č. 1
Ak chcete zadať obyčajný výraz tabuľky (CTE), použite príkaz s. Môžete napríklad spustiť nasledujúci dotaz.
WITH common_table_expression AS (SELECT * FROM sys.objects)(SELECT * FROM common_table_expression)
Potom spustite tento dotaz.
SELECT *FROM sys.dm_exec_query_statsWHERE statement_start_offset > statement_end_offsetANDstatement_end_offset <> -1
V tomto scenári obsahuje plán dotazu vo vyrovnávacej pamäti pre tento dotaz nesprávne statement_start_offset a statement_end_offset hodnoty. Konkrétne si všimnete, že statement_end_offset hodnota je menšia ako hodnota statement_start_offset pri spustení sys.dm_exec_query_stats dynamického zobrazenia správy (DMV). Z dôvodu tohto problému môže zostava výkonu zlyhať, keď zostava predpokladá, že hodnota statement_start_offset je vždy menšia ako hodnota statement_stop_offset.
Scenár č. 2
Môžete zadať obyčajný výraz tabuľky pomocou príkazu s a môžete použiť možnosť překompilovat. Môžete napríklad vytvoriť funkciu v SQL Server 2008 pomocou nasledujúceho 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
Keď spustíte dotaz "Select dbo. function1 ()", zobrazí sa toto chybové hlásenie:
V aktuálnom príkaze sa vyskytla závažná chyba. Prípadné výsledky by mali byť zahodené.
Táto chyba sa môže vyskytnúť aj bez možnosti překompilovat, ak SQL Server zažíva ťažký prenos na server.
Scenár 3
Môžete zadať obyčajný výraz tabuľky pomocou príkazu s. V príkaze s vykonaním zadáte tabuľku, ktorá neexistuje. Môžete napríklad spustiť nasledujúci dotaz.
WITH computed_table (id) AS(SELECT id FROM this_table_does_not_exist) (SELECT id FROM dbo.computed_table) GO
Pri spustení tohto dotazu sa nezobrazí chyba chýbajúcej tabuľky.
Príčina
Tieto problémy sa vyskytujú z dôvodu nefunkčnosti spracovania príkazu SELECT, ktorý nasleduje po vyhlásení. Príkaz s použije nasledujúcu syntax.
WITH common_table_expression AS(CTE_query_definition)
Toto vyhlásenie potom vytvorí množinu výsledkov, ktorá je priradená k názvu bežného výrazu tabuľky, ktorý bol zadaný. Potom budete postupovať podľa tohto prehlásenia s príkazom SELECT. Ak je tento druhý príkaz uzavretý v zátvorkách a potom sa pokúsite vykonať operáciu s výsledkami alebo sa pokúsite spustiť sys.dm_exec_query_stats dynamického zobrazenia správy, dostanete nesprávne výsledky alebo chybu.
Riešenie
Informácie o balíku Service Pack Ak chcete tento problém vyriešiť, Získajte najnovší balík Service Pack pre SQL Server 2008. Ďalšie informácie nájdete v článku databázy Microsoft Knowledge Base, ktorý sa zobrazí po kliknutí na príslušné číslo článku:
968382 Získanie najnovšieho balíka Service Pack pre SQL Server 2008
Alternatívne riešenie
Ak chcete obísť tieto problémy, musíte odstrániť zátvorky z vyjadrenia, ktoré nasleduje po bežnom výraze tabuľky. Predpokladajme napríklad, že ide o príkaz, ktorý používa takéto zátvorky.
WITH common_table_expression AS (SELECT *FROM sys.objects)(SELECT * FROM common_table_expression)
Ak chcete obísť tieto problémy, zmeňte tento príkaz s príkazom, ktorý nepoužíva tieto zátvorky.
WITH common_table_expression AS (SELECT *FROM sys.objects)SELECT * FROM common_table_expressio
Stav
Spoločnosť Microsoft potvrdila, že ide o problém v produktoch spoločnosti Microsoft, ktoré sú uvedené v časti vzťahuje sa na. Tento problém bol opravený v balíku SQL Server 2008 Service Pack 2 (SP2).
Ďalšie informácie
Ďalšie informácie o používaní príkazu s s bežným výrazom tabuľky nájdete na nasledujúcej webovej stránke MSDN:
S common_table_expression (Transact-SQL)Ďalšie informácie o sys.dm_exec_query_stats, navštívte nasledujúcu webovú stránku MSDN: