Преминаване към основното съдържание
Поддръжка
Влизане с Microsoft
Влезте или създайте акаунт.
Здравейте,
Изберете друг акаунт.
Имате няколко акаунта
Изберете акаунта, с който искате да влезете.

Симптоми

На компютър, на който се изпълнява 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:

sys.dm_exec_query_stats (преговаряне – SQL)

Нуждаете ли се от още помощ?

Искате ли още опции?

Разгледайте ползите от абонамента, прегледайте курсовете за обучение, научете как да защитите устройството си и още.

Общностите ви помагат да задавате и отговаряте на въпроси, да давате обратна връзка и да получавате информация от експерти с богати знания.

Беше ли полезна тази информация?

Доколко сте доволни от качеството на езика?
Какво е повлияло на вашия потребителски опит?
Като натиснете „Подаване“, вашата обратна връзка ще се използва за подобряване на продуктите и услугите на Microsoft. Вашият ИТ администратор ще може да събира тези данни. Декларация за поверителност.

Благодарим ви за обратната връзка!

×