2

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

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

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

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

Msg 215, Level 16, State 1, Line 6 Parameters supplied for object 'Posts' which is not a function. If the parameters are intended as a table hint, a WITH keyword is required.

Снятие (NOLOCK) после Posts делает мой DB счастливым.

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

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

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

+2

без уважительной причины, NOLOCK, вероятно, должен использоваться только в таких случаях, как отчетность ... в противном случае вы могли бы читать незаданные данные ... –

ответ

4

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

Omitting the WITH keyword is a deprecated feature and will be removed in a future version of 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

В этом случае мы можем обосновать внесение изменений в код, спасибо. – markd

1

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

С NOLOCK намеков в КТР, они оба работают:

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); 

Эти все работы за пределами КТР:

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.

Смежные вопросы