【问题标题】:Order of (nolock) and table aliases on SQL ServerSQL Server 上 (nolock) 和表别名的顺序
【发布时间】:2018-08-24 03:14:14
【问题描述】:

所以我有一个精简的 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) 是否合适以及语法应该保持内部一致的问题,有什么想法会发生这种情况吗?我试图搜索解决此问题的修补程序/知识库,但一无所获。 SQL 服务器上是否有可能导致此行为的设置?

【问题讨论】:

  • 数据库设置为什么兼容级别?
  • 什么是“有效”和“它不...”是什么意思,您收到错误消息和/或锁定?

标签: sql sql-server sql-server-2005


【解决方案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】:

    我不确定,但可能是由compatibility level引起的?

    由于 SQL 2005 默认正确的提示语法是WITH (NOLOCK),也许这就是原因。

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-02-02
        • 1970-01-01
        • 2020-04-28
        • 1970-01-01
        • 2019-05-15
        相关资源
        最近更新 更多