【问题标题】:WTH (NOLOCK) syntax fo subquery子查询的 WITH (NOLOCK) 语法
【发布时间】:2017-11-19 10:51:07
【问题描述】:

我正在尝试在报告查询中添加 with (nolock),当运行时锁定整个数据库,使其他用户无法使用该数据库。

我不知道在这种情况下如何使用:

-- this is just an example:
SELECT FIELDS FROM (SELECT * FROM ATABLE) AS SUB

这给出了语法错误:

SELECT FIELDS FROM (SELECT * FROM ATABLE) WITH (NOLOCK) AS SUB

WITH (NOLOCK) 应该放在哪里?

我并不是说这是解决所有问题的方法,它只是我想要的测试。

谢谢!

【问题讨论】:

    标签: sql-server sql-server-2008-r2 nolock


    【解决方案1】:

    如果涉及更多表并且涉及多个查询并且您不关心脏读,则将事务的隔离级别设置为read uncommited,而不是在任何地方写Nolock

    SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
    

    【讨论】:

    • 在我的上下文中,如果在 SELECT 语句之前我写这个命令我得到了相同的结果——我刚刚做了一个测试。谢谢。
    【解决方案2】:

    我会把它放在这里,但要注意的是你正在使用一个视图,所以它真的应该放在视图中的表格上:

    SELECT FIELDS FROM (SELECT * FROM MYVIEW WITH (NOLOCK)) AS SUB 
    

    【讨论】:

      【解决方案3】:

      如果您关心准确性,则不应将其放在报告的任何位置。这个提示有一些非常有趣的事情,很多人并不完全理解。 http://blogs.sqlsentry.com/aaronbertrand/bad-habits-nolock-everywhere/

      但是,如果您一心想继续,则表格提示属于表格旁边。当然,由于这是一个视图,它不会有太大帮助。

      SELECT FIELDS FROM (SELECT * FROM MYVIEW WITH (NOLOCK)) AS SUB
      

      【讨论】:

      • 谢谢。我使用 ATABLE 而不是 MYVIEW 修改了示例,现在语法很好,谢谢。我现在谈到了无锁的风险,但在我的上下文中,我知道由于上下文的原因,这是可以接受的风险。
      • 酷。有时对于结果接近的报告是可以的。
      猜你喜欢
      • 2014-02-02
      • 2021-01-31
      • 1970-01-01
      • 2012-08-20
      • 2020-10-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多