我今天遇到了一个问题,试图使用NOLOCK
. 我收到了这个错误:
Remote table-valued function calls are not allowed.
在谷歌搜索这个问题后,我发现添加WITH (NOLOCK)
可以纠正这个问题。我想知道为什么会这样?
SQL:
SELECT *
FROM [LINKED_SRV].[DB1].[dbo].[REMOTE_TABLE] WITH (NOLOCK)
我今天遇到了一个问题,试图使用NOLOCK
. 我收到了这个错误:
Remote table-valued function calls are not allowed.
在谷歌搜索这个问题后,我发现添加WITH (NOLOCK)
可以纠正这个问题。我想知道为什么会这样?
SQL:
SELECT *
FROM [LINKED_SRV].[DB1].[dbo].[REMOTE_TABLE] WITH (NOLOCK)
引用表格提示的文档:
重要的
省略 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
不是函数参数的地步。
诺锁
此表提示(也称为 READUNCOMMITTED)仅适用于 SELECT 语句。NOLOCK 表示没有对表发出共享锁,以阻止其他事务修改表中的数据。
http://www.techrepublic.com/article/using-nolock-and-readpast-table-hints-in-sql-server/6185492