Перейти до основного
Підтримка
Вхід
Вхід за допомогою облікового запису Microsoft
Увійдіть або створіть обліковий запис.
Вітаємо,
Виберіть інший обліковий запис.
У вас є кілька облікових записів
Виберіть обліковий запис, за допомогою якого потрібно ввійти.

Ознаки

На комп'ютері, на якому запущено Microsoft SQL Server 2008, розглянемо наведені нижче сценарії.

Сценарій 1

Ви вказуєте загальні вирази таблиці (CTE), використовуючи оператор із заявою. Наприклад, ви запускаєте наведений нижче запит.

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 computed_table (id) AS(SELECT id FROM this_table_does_not_exist) (SELECT id FROM dbo.computed_table) GO

Під час запуску цього запиту не з'являється повідомлення про помилку відсутньої таблиці.

Причина

Ці проблеми виникають через несправність обробки SELECT, що слідує за заявою. Оператор із заявою використовує наведений нижче синтаксис.

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, перелічених у розділі "застосовується до". Цю проблему було спочатку виправлено в SQL Server 2008 із пакетом оновлень 2 (SP2).

Додаткові відомості

Щоб отримати докладні відомості про те, як використовувати оператор WITH із загальним виразом таблиці, перейдіть на таку веб-сторінку MSDN:

З common_table_expression (Transact-SQL)Щоб отримати докладніші відомості про sys.dm_exec_query_stats, перейдіть на таку веб-сторінку MSDN:

sys.dm_exec_query_stats (Transact-SQL)

Потрібна додаткова довідка?

Потрібні додаткові параметри?

Ознайомтеся з перевагами передплати, перегляньте навчальні курси, дізнайтесь, як захистити свій пристрій тощо.

Спільноти допомагають ставити запитання й відповідати на них, надавати відгуки та дізнаватися думки висококваліфікованих експертів.

Чи ця інформація була корисною?

Наскільки ви задоволені якістю мови?
Що вплинуло на ваші враження?
Натиснувши кнопку "Надіслати", ви надасте свій відгук для покращення продуктів і служб Microsoft. Ваш ІТ-адміністратор зможе збирати ці дані. Декларація про конфіденційність.

Дякуємо за відгук!

×