今天我遇到了一个问题,试图使用NOLOCK
访问远程表。我收到了这个错误:
Remote table-valued function calls are not allowed.
通过Google搜索问题,我发现添加WITH (NOLOCK)
可以解决问题。我想知道为什么会这样?
SQL:
SELECT *
FROM [LINKED_SRV].[DB1].[dbo].[REMOTE_TABLE] WITH (NOLOCK)
答案 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