2009-07-28 10 views
13

Więc mam oświadczenie SQL, które pominięto w wygląda mniej więcej tak:Order (NOLOCK) i aliasy tabeli na SQL Server

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

Stwierdzenie to działa na moim środowisku SQL 2005 i SQL 2008. Nie działa na zdalnym środowisku SQL 2005. Ostatnia linia została zmieniona na:

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

Działa w odległym środowisku.

Pomijając kwestie dotyczące tego, czy (nolock) jest właściwe i czy składnia powinna pozostać spójna wewnętrznie, czy istnieją jakieś pomysły, dlaczego tak się dzieje? Próbowałem szukać poprawek/KB, które sobie z tym poradziły i nie znalazłem nic. Czy istnieje ustawienie serwera SQL, które może spowodować to zachowanie?

+4

Jaki poziom zgodności bazy danych jest ustawiony? –

+1

co oznacza "działa" i "nie działa w dniu" oznacza, że ​​pojawia się komunikat o błędzie i/lub blokowanie? –

Odpowiedz

8

Sprawdź poziom zgodności bazy danych.

Powinna być 90, aby ta składnia działała.

Wystarczy sprawdzić:

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

Nie widziałem wcześniej poziomu zgodności. Perfekcyjnie, dzięki! – Matt

4

Nie jestem pewien, ale może jest to spowodowane przez compatibility level?

Ponieważ SQL 2005 domyślnie poprawna składnia wskazówka jest WITH (NOLOCK) i być może to jest powód.