Simptomi
Na računaru koji radi pod sistemom Microsoft SQL Server 2008 razmotrite sledeće scenarije.
1. scenario
Pomoću izraza WITH navodite zajednički izraz tabele (CTE). Na primer, pokrenete sledeć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, keširani plan upita za ovaj upit skladišti netačne statement_start_offset i statement_end_offset vrednosti. Konkretno, primećujete da statement_end_offset vrednost manja od statement_start_offset vrednosti kada pokrenete sys.dm_exec_query_stats dinamički prikaz upravljanja (DMV). Zbog ovog problema, izveštaj o performansama može da ne uspe kada izveštaj pretpostavi da statement_start_offset vrednost uvek manja od statement_stop_offset vrednosti.
2. scenario
Pomoću izraza "WITH" navodite zajednički izraz tabele i koristite opciju "PONOVO SVRŠi". Na primer, funkciju kreirate u sistemu SQL Server 2008 pomoću sledeć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 "izaberi dbo.function1()", dobijate sledeću poruku o grešci:
Došlo je do ozbiljne greške na trenutnoj komandi. Rezultati, ako ih ima, treba da budu odbačeni.
Pored toga, do ove greške može doći bez opcije PONOVNOG IZVRŠAVANJA ako SQL server ima težak promet na serveru.
Scenario 3
Pomoću izraza WITH navodite zajednički izraz tabele. U izvodu WITH navodite tabelu koja ne postoji. Na primer, pokrenete sledeć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ćete dobiti grešku za tabelu koja nedostaje.
Uzrok
Do ovih problema dolazi zbog neispravne obrade izjave SELECT koja sledi nakon izvoda SA. Izvod WITH koristi sledeću sintaksu.
WITH common_table_expression AS(CTE_query_definition)
Ova izjava zatim kreira skup rezultata koji je dodeljen zajedničkom imenu izraza tabele koje je navedeno. Zatim sledite ovu izjavu sa izjavom SELECT. Ako je ova druga izjava stavljena u zagrade, a zatim pokušate da izvršite operaciju sa rezultatima ili pokušate da pokrenete sys.dm_exec_query_stats dinamički prikaz upravljanja, dobijate netačne rezultate ili grešku.
Rešenje
Informacije o servisnom paketu Da biste rešili ovaj problem, nabavite najnoviji servisni paket za SQL Server 2008. Za više informacija kliknite na sledeći broj članka da biste videli članak u Microsoft bazi znanja:
968382 Nabavljanje najnovijeg servisnog paketa za SQL Server 2008
Rešenje
Da biste otklonili ove probleme, morate da uklonite zagrade iz izvoda koji sledi iza zajedničkog izraza tabele. Na primer, uzmite u obzir sledeću SA izjavu koja koristi takve zagrade.
WITH common_table_expression AS (SELECT *FROM sys.objects)(SELECT * FROM common_table_expression)
Da biste zaobišli ove probleme, promenite na sledeću SA izjavu koja ne koristi ove zagrade.
WITH common_table_expression AS (SELECT *FROM sys.objects)SELECT * FROM common_table_expressio
Status
Microsoft je potvrdio da je ovo problem u Microsoft proizvodima koji su navedeni u odeljku "Odnosi se na". Ovaj problem je prvi put ispravljen u SQL Server 2008 servisnom paketu 2 (SP2).
Više informacija
Za više informacija o korišćenju izraza WITH sa uobičajenim izrazom tabele posetite sledeću MSDN Veb stranicu:
SA common_table_expression (Transact-SQL)Za više informacija o sys.dm_exec_query_stats posetite sledeću MSDN Veb stranicu: