Simptomi
Na računalu na kojem je instaliran Microsoft SQL Server 2008 razmotrite sljedeće scenarije.
Prvi scenarij
Možete navesti uobičajen izraz tablice (CTE) pomoću naredbe WITH. Možete, primjerice, pokrenuti sljedeći upit.
WITH common_table_expression AS (SELECT * FROM sys.objects)(SELECT * FROM common_table_expression)
Zatim pokrenete ovaj upit.
SELECT *FROM sys.dm_exec_query_statsWHERE statement_start_offset > statement_end_offsetANDstatement_end_offset <> -1
U ovom scenariju predmemorirani plan upita za ovaj upit pohranjuje netočne statement_start_offset i statement_end_offset vrijednosti. Konkretno, primijetit ćete da je vrijednost statement_end_offset manja od vrijednosti statement_start_offset kada pokrenete sys.dm_exec_query_stats prikaz dinamičke kontrole (DMV). Zbog tog problema izvješće o izvedbi može propasti kada izvješće pretpostavlja da je vrijednost statement_start_offset uvijek manja od vrijednosti statement_stop_offset.
Drugi scenarij
Možete navesti uobičajen izraz tablice pomoću naredbe WITH, a koristite mogućnost REKOMPILIRANJE. Na primjer, stvorite funkciju u sustavu SQL Server 2008 pomoću sljedeće skripte.
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
Kada pokrenete upit "Select d. function1 ()", prikazat će vam se sljedeća poruka o pogrešci:
Došlo je do ozbiljne pogreške u aktualnoj naredbi. Rezultat, ako ih ima, trebao bi biti odbačen.
Uz to, ta se pogreška može pojaviti bez mogućnosti REKOMPILIRANJA ako SQL poslužitelj doživljava težak promet poslužitelja.
Treći scenarij
Možete navesti uobičajen izraz tablice pomoću naredbe WITH. U naredbi WITH navedite tablicu koja ne postoji. Možete, primjerice, pokrenuti sljedeći upit.
WITH computed_table (id) AS(SELECT id FROM this_table_does_not_exist) (SELECT id FROM dbo.computed_table) GO
Kada pokrenete ovaj upit, neće vam se prikazati pogreška za tablicu koja nema.
Uzrok
Ti se problemi javljaju zbog neispravnog obrade naredbe SELECT koja slijedi naredbe WITH. Naredba WITH koristi sljedeću sintaksu.
WITH common_table_expression AS(CTE_query_definition)
Ova izjava potom stvara skup rezultata dodijeljen nazivu uobičajenog izraza tablice koji je naveden. Zatim slijedite ovu izjavu pomoću naredbe SELECT. Ako je ta druga izjava zatvorena u zagradama, a zatim pokušate izvršiti operaciju na rezultatima ili pokušate pokrenuti sys.dm_exec_query_stats prikaz dinamičke kontrole, primit ćete pogrešne rezultate ili pogrešku.
Rješenje
Informacije o servisnom paketu Da biste riješili taj problem, Nabavite najnoviji servisni paket za SQL Server 2008. Za više informacija kliknite sljedeći broj članka da biste prikazali članak u Microsoftovoj bazi znanja:
968382 Kako nabaviti najnoviji servisni paket za SQL Server 2008
Zaobilazno rješenje
Da biste zaobišli te probleme, morate ukloniti zagrade iz naredbe koja slijedi prema uobičajenom izrazu tablice. Na primjer, razmotrite sljedeće s izjavom koja koristi takve zagradama.
WITH common_table_expression AS (SELECT *FROM sys.objects)(SELECT * FROM common_table_expression)
Da biste zaobišli te probleme, promijenite sljedeće u izjavi koja ne koristi te zagradama.
WITH common_table_expression AS (SELECT *FROM sys.objects)SELECT * FROM common_table_expressio
Status
Microsoft je potvrdio da se radi o problemu u Microsoftovim proizvodima navedenim u odjeljku "odnosi se na". Taj je problem prvi put ispravljen u sustavu SQL Server 2008 Service Pack 2 (SP2).
Dodatne informacije
Dodatne informacije o korištenju naredbe WITH u uobičajenom izrazu tablice potražite na sljedećem MSDN web-mjestu:
S common_table_expression (Transact-SQL)Dodatne informacije o sys.dm_exec_query_stats potražite na sljedećem MSDN web-mjestu: