Симптоми
На компютър, на който се изпълнява Microsoft SQL Server 2008, обмислете следните сценарии.
Сценарий 1
Указвате обикновен израз на таблица (КТР) с помощта на командата WITH. Например стартирате следната заявка.
WITH common_table_expression AS (SELECT * FROM sys.objects)(SELECT * FROM common_table_expression)
След това изпълнявате тази заявка.
SELECT *FROM sys.dm_exec_query_statsWHERE statement_start_offset > statement_end_offsetANDstatement_end_offset <> -1
В този случай кешираният план за заявки за тази заявка съхранява неправилни statement_start_offset и statement_end_offset стойности. По-конкретно ще забележите, че стойността за statement_end_offset е по-малка от стойността statement_start_offset, когато изпълнявате sys.dm_exec_query_stats динамичен изглед за управление (DMV). Поради този проблем може да се провали отчетът за производителността, когато отчетът предполага, че стойността за statement_start_offset винаги е по-малка от стойността на statement_stop_offset.
Сценарий 2
Указвате обикновен израз на таблица с помощта на командата WITH и използвате опцията за КОМПИЛИРАне. Например създавате функция в SQL Server 2008 с помощта на следния скрипт.
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
Когато изпълните заявка "Select DBO. function1 ()", получавате следното съобщение за грешка:
Възникнала е тежка грешка в текущата команда. Резултатите, ако има такива, трябва да бъдат отхвърлени.
Освен това тази грешка може да възникне без опцията за КОМПИЛИРАне, ако SQL Server е с тежък трафик на сървъра.
Сценарий 3
Указвате обикновен израз на таблица с помощта на командата WITH. В командата WITH указвате таблица, която не съществува. Например стартирате следната заявка.
WITH computed_table (id) AS(SELECT id FROM this_table_does_not_exist) (SELECT id FROM dbo.computed_table) GO
Когато изпълните тази заявка, не получавате съобщение за грешка за липсващата таблица.
Причина
Тези проблеми възникват поради неизправност при обработката на командата SELECT, която следва декларация за избиране. Командата WITH използва следния синтаксис.
WITH common_table_expression AS(CTE_query_definition)
След това тази инструкция създава набор от резултати, който е присвоен на обичайното име на израз на таблица, което е зададено. След това можете да следвате тази инструкция с командата SELECT. Ако тази втора инструкция е оградена в скоби и след това се опитате да изпълните операция върху резултатите или се опитате да изпълните sys.dm_exec_query_stats динамичен изглед за управление, получавате неправилни резултати или грешка.
Решение
Информация за сервизния пакет За да отстраните този проблем, получете най-новия сервизен пакет за SQL Server 2008. За допълнителна информация щракнете върху следния номер на статия, за да прегледате статията в базата знания на Microsoft:
968382 Как да получите най-новия сервизен пакет за SQL Server 2008
Заобиколно решение
За да заобиколите тези проблеми, трябва да премахнете скобите от командата, която следва общия израз на таблица. Например имайте предвид следното с инструкция, която използва такива кръгли скоби.
WITH common_table_expression AS (SELECT *FROM sys.objects)(SELECT * FROM common_table_expression)
За да заобиколите тези проблеми, преминете към следното с инструкция, която не използва тези скоби.
WITH common_table_expression AS (SELECT *FROM sys.objects)SELECT * FROM common_table_expressio
Състоянието
Microsoft потвърди, че това е проблем в продуктите на Microsoft, които са посочени в секцията "важи за". Този проблем е коригиран първо в SQL Server 2008 Service Pack 2 (SP2).
Повече информация
За повече информация как да използвате командата с с често срещан израз на таблица, посетете следната уеб страница на MSDN:
С common_table_expression (преговаряне – SQL)За повече информация за sys.dm_exec_query_stats посетете следната уеб страница на MSDN: