Simptome
Pe un computer care rulează Microsoft SQL Server 2008, luați în considerare următoarele scenarii.
Situaţia 1
Specificați o expresie comună de tabel (CTE) utilizând instrucțiunea cu. De exemplu, veți executa următoarea interogare.
WITH common_table_expression AS (SELECT * FROM sys.objects)(SELECT * FROM common_table_expression)
Apoi, rulează această interogare.
SELECT *FROM sys.dm_exec_query_statsWHERE statement_start_offset > statement_end_offsetANDstatement_end_offset <> -1
În acest scenariu, planul de interogare în cache pentru această interogare stochează valori statement_start_offset incorecte și statement_end_offset. Mai exact, observați că valoarea de statement_end_offset este mai mică decât valoarea statement_start_offset atunci când se rulează sys.dm_exec_query_stats vizualizarea gestionare dinamică (DMV). Din această problemă, un raport de performanță poate să nu reușească atunci când raportul presupune că valoarea de statement_start_offset este întotdeauna mai mică decât valoarea statement_stop_offset.
Situaţia 2
Specificați o expresie de tabel comună utilizând instrucțiunea cu și utilizați opțiunea recompilare. De exemplu, creați o funcție în SQL Server 2008 utilizând următorul script.
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
Atunci când rulează o interogare "Selectați dbo. function1 ()", primiți următorul mesaj de eroare:
S-a produs o eroare severă la comanda curentă. Rezultatele, dacă este cazul, ar trebui eliminate.
În plus, această eroare poate apărea fără opțiunea recompilare dacă SQL Server se confruntă cu trafic greu de server.
Scenariul 3
Specificați o expresie de tabel comună utilizând instrucțiunea cu. În instrucțiunea cu, specificați un tabel care nu există. De exemplu, veți executa următoarea interogare.
WITH computed_table (id) AS(SELECT id FROM this_table_does_not_exist) (SELECT id FROM dbo.computed_table) GO
Când se execută această interogare, nu primiți o eroare pentru tabelul lipsă.
Cauză
Aceste probleme apar din cauza unei prelucrări defectuoase a unei instrucțiuni SELECT care urmează o instrucțiune cu. Instrucțiunea WITH utilizează următoarea sintaxă.
WITH common_table_expression AS(CTE_query_definition)
Această instrucțiune creează apoi un set de rezultate atribuit numelui de expresie tabel comun care a fost specificat. Apoi, urmați această declarație cu o instrucțiune SELECT. Dacă această a doua instrucțiune este încadrată între paranteze, apoi încercați să efectuați o operațiune pentru rezultate sau încercați să rulați o sys.dm_exec_query_stats vizualizare de gestionare dinamică, primiți rezultate incorecte sau o eroare.
Rezolvare
Informații despre pachetul de servicii Pentru a rezolva această problemă, obțineți cel mai recent pachet Service Pack pentru SQL Server 2008. Pentru mai multe informații, faceți clic pe următorul număr de articol pentru a-l vedea în Baza de cunoștințe Microsoft:
968382 Cum se obține cel mai recent pachet Service Pack pentru SQL Server 2008
Soluție de evitare
Pentru a evita aceste probleme, trebuie să eliminați parantezele din instrucțiunea care urmează expresiei comune a tabelului. De exemplu, luați în considerare următoarele cu instrucțiune care utilizează aceste paranteze.
WITH common_table_expression AS (SELECT *FROM sys.objects)(SELECT * FROM common_table_expression)
Pentru a rezolva aceste probleme, treceți la următoarele cu instrucțiune care nu utilizează aceste paranteze.
WITH common_table_expression AS (SELECT *FROM sys.objects)SELECT * FROM common_table_expressio
Stare
Microsoft a confirmat că aceasta este o problemă în produsele Microsoft listate în secțiunea "se aplică la". Această problemă a fost corectată pentru prima dată în SQL Server 2008 Service Pack 2 (SP2).
Mai multe informații
Pentru mai multe informații despre cum să utilizați instrucțiunea cu o expresie comună a tabelului, vizitați următoarea pagină Web MSDN:
CU common_table_expression (Transact-SQL)Pentru mai multe informații despre sys.dm_exec_query_stats, vizitați următoarea pagină Web MSDN: