Ошибка от NOLOCK на CTE в SQL Server 2008 с пакетом обновления 2 - PullRequest
2 голосов
/ 16 августа 2011

Я только что настроил SQL Server 2008 SP2 на моей рабочей станции для запуска локальной версии базы данных. Производственная база данных - SQL Server 2008 R2 . Коллега запускает SQL Server 2005 на своей рабочей станции.

Моя БД выдает ошибку со следующим кодом, в то время как другие экземпляры той же БД на других серверах выполняют этот запрос без ошибок.

WITH Posts AS (
    SELECT TOP 10 *
    FROM TBL_MSG_LATEST (NOLOCK)
    WHERE TBL_MSG_LATEST.STATUS = 1
) 
SELECT * FROM Posts (NOLOCK)

... выдает эту ошибку:

Сообщение 215, Уровень 16, Состояние 1, Строка 6 Параметры, предоставленные для объекта 'Posts', который не является функцией. Если параметры предназначены для подсказки таблицы, необходимо ключевое слово WITH.

Удаление (NOLOCK) после Posts делает мою БД счастливой.

Я не знаком с SQL Server, поэтому я не совсем понимаю CTE, но я считаю, что это NOLOCK может даже не понадобиться здесь.

Однако мы не рады вносить изменения в кодовую базу только для того, чтобы удовлетворить мою среду разработки.

Есть ли разница в конфигурации с моей более новой средой БД? Есть ли веская причина удалить NOLOCK, который я не могу расшифровать из сообщения об ошибке?

Ответы [ 2 ]

4 голосов
/ 16 августа 2011

С этой страницы: http://msdn.microsoft.com/en-us/library/ms187373.aspx

Пропуск ключевого слова WITH является устаревшей функцией и будет удален в будущей версии Microsoft SQL Server.

Итакэто сработает.

WITH Posts AS (
    SELECT TOP 10 *
    FROM TBL_MSG_LATEST WITH (NOLOCK)
    WHERE TBL_MSG_LATEST.STATUS = 1
) 
SELECT * FROM Posts WITH (NOLOCK)

Не знаю, хорошая ли это идея или нет или она имеет какой-либо эффект.

1 голос
/ 17 августа 2011

Это, похоже, характерно для синтаксиса CTE.Добавление «WITH» не изменит работу NOLOCK;он просто позволит работать.

С подсказками NOLOCK в CTE они оба работают:

WITH Posts AS (
    SELECT ... FROM TBL_MSG_LATEST NOLOCK
)
SELECT * FROM Posts NOLOCK;

WITH Posts AS (
    SELECT ... FROM TBL_MSG_LATEST WITH (NOLOCK)
)
SELECT * FROM Posts WITH (NOLOCK);

, но это не удается:

WITH Posts AS (
    SELECT ... FROM TBL_MSG_LATEST (NOLOCK)
)
SELECT * FROM Posts (NOLOCK);

Все они работают за пределами CTE:

SELECT ... FROM TBL_MSG_LATEST NOLOCK;
SELECT ... FROM TBL_MSG_LATEST (NOLOCK);
SELECT ... FROM TBL_MSG_LATEST WITH (NOLOCK);

Правильный синтаксис: "WITH (NOLOCK)".

Но ... если выпомещая NOLOCK в CTE, почему вы также помещаете его в SELECT?

Обратите внимание, что результаты в Denali CTP3 одинаковы.

...