2009-07-28 18 views
13

Así que tengo una instrucción SQL que pelado abajo es como la siguiente:(nolock) y alias de tabla en SQL Server

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

Este comando funciona en mis entornos SQL 2005 y SQL 2008. No lo hace en un entorno SQL 2005 remoto. Cambié la última línea a:

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

Esto funciona en el entorno remoto.

Poniendo a un lado las cuestiones de si (nolock) es apropiado y que la sintaxis debe permanecer internamente consistente, ¿alguna idea de por qué sucede esto? Intenté buscar hotfix/KB que trataran con esto y no obtuve nada. ¿Hay alguna configuración en el servidor SQL que pueda causar este comportamiento?

+4

Qué nivel de compatibilidad se establece en la base de datos? –

+1

¿Qué significa "funciona" y "no funciona ..." significa que aparece un mensaje de error y/o bloqueo? –

Respuesta

8

Compruebe el nivel de compatibilidad de su base de datos.

Debe ser 90 para que funcione esta sintaxis.

acaba de comprobar:

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

No había visto el nivel de compatibilidad anteriormente. ¡Perfecto gracias! – Matt

4

No estoy seguro, pero tal vez es causado por compatibility level?

Desde SQL 2005 por defecto, la sintaxis correcta de la pista es WITH (NOLOCK) y tal vez este es el motivo.