如果在SQL Server中的视图上使用"WITH NOLOCK"查询提示,它是否会将该提示传播到视图定义本身,即使NOLOCK未用于视图定义中的原始表?需要这样做的原因是,有时支持人员希望执行大量耗时的查询,但不希望使用应用程序本身中的视图对所有查询强制执行此锁定.

推荐答案

是的,NOLOCK将传播到视图定义使用的表中(至少在SQLServer2005中是这样).

参见MSDN中的Table Hints:

在SQL Server 2005中,所有锁提示都会传播到视图中引用的所有表和视图.此外,SQL Server还会执行相应的锁一致性判断.

然而,

如果一个表包含计算列,而计算列是由访问其他表中的列的表达式或函数计算的,则这些表不会使用表提示.这意味着不会传播表提示.例如,在查询中的表上指定NOLOCK table提示.此表包含由表达式和函数组合计算的计算列,这些表达式和函数访问另一个表中的列.表达式和函数引用的表在访问时不使用NOLOCK table提示.

如果您使用的是索引视图,您可能需要多读一些,因为其中也有一些特殊情况.

更多信息请参见View Resolution.

Sql相关问答推荐

SQL从同一表连接列

在SQL:2003(PGQ)中,Cypher查询语言、GQL、PGQL和属性图查询的常见子集是什么?'

如何并行SELECT和RESET?

用于平均多个数据并与一个数据点进行比较以判断偏移量的SQL查询

对非RUST源代码字符串使用`stringify!`,例如SQL查询

SQL:计算与另一列中给定值互斥的匹配项

替换上一个或下一个值中的空值并添加其价格日期

如何在SQL Server中统计按备注分组的记录数

仅当交叉应用返回单值时才更新记录

对于多字节字符,SQL Server中的DATALENGTH返回1字节

Athena 计算从日期到当前时间戳的每月计数

根据标识符将两行合并为一行

通过ID和数据找到每个不同的值

递归 CTE 附加为行

如何将输出转换为二维格式?

SQL Select 最大并获取列名

如何对 SQL 表中的连续时间戳进行分组?

如何从 2 个 SQLite 表构建嵌套对象?

PlSql 陷入死循环

SQL中所有先前日期的累计总和