Порядок (nolock) и псевдонимов таблиц на SQL Server

Итак, у меня есть инструкция SQL, которая выглядит примерно так:

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-сервере, которая может вызвать это поведение?

Ответы

Ответ 1

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

Для этого синтаксиса должно быть 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'.

Ответ 2

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

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