在远程表呼叫上使用NOLOCK时为什么需要WITH?

时间:2013-06-21 19:17:00

标签: sql sql-server-2008

今天我遇到了一个问题,试图使用NOLOCK访问远程表。我收到了这个错误:

Remote table-valued function calls are not allowed.

通过Google搜索问题,我发现添加WITH (NOLOCK)可以解决问题。我想知道为什么会这样?

SQL:

SELECT *
FROM [LINKED_SRV].[DB1].[dbo].[REMOTE_TABLE] WITH (NOLOCK)

2 个答案:

答案 0 :(得分:3)

引用the documentation for table hints

  

重要

     

省略WITH关键字是一项不推荐使用的功能:此功能将在Microsoft SQL Server的未来版本中删除。避免在新的开发工作中使用此功能,并计划修改当前使用此功能的应用程序。

     

允许使用和不使用WITH关键字的下表提示:NOLOCK,READUNCOMMITTED,UPDLOCK,REPEATABLEREAD,SERIALIZABLE,READCOMMITTED,TABLOCK,TABLOCKX,PAGLOCK,ROWLOCK,NOWAIT,READPAST,XLOCK和NOEXPAND。如果在没有WITH关键字的情况下指定了这些表提示,则应单独指定提示。

该文档指出,对于您尝试的查询,允许省略WITH关键字。基于此,我认为这是一个错误。但是,该文档还指出此功能已弃用,将在SQL Server的未来版本中删除,因此您不应期望以任何其他方式修复此错误,而不是更改文档。

我怀疑解析器看到FROM server.database.schema.table (并判断这是对用户定义函数的调用,因此是一个错误,并且永远不会到达NOLOCK不是{函数参数。

答案 1 :(得分:0)

NOLOCK

此表提示(也称为READUNCOMMITTED)仅适用于SELECT语句。 NOLOCK表示不会对表发出共享锁,禁止其他事务修改表中的数据。

http://www.techrepublic.com/article/using-nolock-and-readpast-table-hints-in-sql-server/6185492