代码之家  ›  专栏  ›  技术社区  ›  Matt

SQL Server上(nolock)和表别名的顺序

  •  15
  • Matt  · 技术社区  · 15 年前

    所以我得到了一个简化后的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 Server上是否有可能导致此行为的设置?

    3 回复  |  直到 6 年前
        1
  •  9
  •   Quassnoi    15 年前

    检查数据库兼容级别。

    应该是 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
  •  4
  •   Grzegorz Gierlik    15 年前

    我不确定,但可能是由于 compatibility level ?

    自SQL 2005以来,默认情况下提示的正确语法为 WITH (NOLOCK) 也许这就是原因。

        3
  •  0
  •   Suketu Bhuta    6 年前

    在处添加答案 https://stackoverflow.com/a/1194913/2200690 , 如果数据库的名称是AdventureWorks,则可以使用以下SQL查找兼容级别:

    USE AdventureWorks2012;  
    GO  
    SELECT compatibility_level  
    FROM sys.databases WHERE name = 'AdventureWorks2012';  
    GO