我知道with(nolock)
和(nolock)
相同或几乎相同。 REF:with(nolock) or (nolock) - Is there a difference?
但nolock
怎么样?您可以在select
中使用其中任何一个,我可以看到的唯一值得注意的差异是使用您可以编写的别名:
select * from table1 as mytable with(nolock)
或
select * from table1 as mytable (nolock)
但你不能写:
select * from table1 as mytable nolock
PS :我不是在讨论nolock
这里的好坏:)
答案 0 :(得分:11)
不同之处在于应该使用语法WITH (NOLOCK)
(或WITH (<any table hint>)
)。为什么呢?
不推荐使用WITH
。来自Table Hints on MSDN:
省略WITH关键字是一项不推荐使用的功能:此功能将在Microsoft SQL Server的未来版本中删除。避免在新的开发工作中使用此功能,并计划修改当前使用此功能的应用程序。
from table1 nolock
根本不应用提示 - 这是别名。例如:
SELECT nolock.name FROM sys.objects nolock ORDER BY nolock.name;
请注意,我可以使用nolock
作为别名。这里没有提示。
from table1 as mytable nolock
在SQL Server的现代版本中是无效的语法。
Msg 1018,Level 15,State 1,Line 12
'nolock'附近的语法不正确。如果这是作为表提示的一部分,则现在需要A WITH关键字和括号。有关正确的语法,请参阅SQL Server联机丛书。
您还应该考虑使用会话级提示SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
,因为之后您没有上面的语法问题,并且您也没有15 WITH (NOLOCK)
乱丢您的查询。这使得以后更难以用不同的隔离级别替换(比如RCSI,它比READ UNCOMMITTED
恕我直言更实用),而单个批次级别的语句是一个非常容易替换的单行。
此外,对于其他读者而言,这比OP更为明确,请务必了解使用NOLOCK
的风险,其中包括在单行中获取从未存在的中的损坏数据< / EM>:
答案 1 :(得分:1)
select查询的表提示部分具有以下语法:
WITH ( <table_hint> [ [, ]...n ] )