2009-07-28 4 views
13

Так что у меня есть SQL заявление, что урезано выглядит примерно так:Орден (NOLOCK) и таблицы псевдонимов на SQL Server

SELECT column 
FROM table t (nolock) 
LEFT OUTER JOIN table2 (nolock) t2 on t.id = t2.id 

Это утверждение работает на моей среде SQL 2005 и SQL 2008. Это не относится к удаленной среде SQL 2005. Я переключил последнюю строку на:

LEFT OUTER JOIN table2 t2 (nolock) on t.id = t2.id 

Это работает в удаленной среде.

Включение вопросов о том, является ли (nolock) подходящим и что синтаксис должен оставаться внутренне согласованным, любые идеи, почему это происходит? Я попытался найти исправления/KBs, которые касались этого, и ничего не придумал. Есть ли настройка на SQL-сервере, которая может вызвать такое поведение?

+4

Какой уровень совместимости устанавливается база данных для? –

+1

Что означает «работает» и «Оно не на ..» означает, что вы получаете сообщение об ошибке и/или блокировку? –

ответ

8

Проверьте уровень совместимости вашей базы данных.

Для этого синтаксиса должно быть 90.

Только что проверил:

sp_dbcmptlevel 'test', 80 

DBCC execution completed. If DBCC printed error messages, contact your system administrator. 

SELECT TOP 100 * 
FROM master t (nolock) 
LEFT OUTER JOIN master (nolock) t2 on t.id = t2.id 

Сообщение 102, уровень 15, состояние 1, строка 3 
Incorrect syntax near 't2'. 
+0

Раньше не видел уровень совместимости. Отлично, спасибо! – Matt

4

Я не уверен, но, возможно, это вызвано compatibility level?

С SQL 2005 по умолчанию правильный синтаксис подсказки WITH (NOLOCK) и, возможно, это причина.

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