Порядок (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)
и, возможно, это причина.