Sql server SQL Server 2008 SP2中CTE上的NOLOCK错误
我刚刚在工作站上设置了SQL Server 2008SP2,以运行本地版本的数据库。生产数据库是SQL Server 2008R2。一位同事正在他的工作站上运行SQL Server 2005 My DB使用以下代码引发错误,而其他服务器上相同DB的其他实例运行此查询时没有错误Sql server SQL Server 2008 SP2中CTE上的NOLOCK错误,sql-server,sql-server-2005,sql-server-2008,sql-server-2008-r2,Sql Server,Sql Server 2005,Sql Server 2008,Sql Server 2008 R2,我刚刚在工作站上设置了SQL Server 2008SP2,以运行本地版本的数据库。生产数据库是SQL Server 2008R2。一位同事正在他的工作站上运行SQL Server 2005 My DB使用以下代码引发错误,而其他服务器上相同DB的其他实例运行此查询时没有错误 WITH Posts AS ( SELECT TOP 10 * FROM TBL_MSG_LATEST (NOLOCK) WHERE TBL_MSG_LATEST.STATUS = 1 ) SEL
WITH Posts AS (
SELECT TOP 10 *
FROM TBL_MSG_LATEST (NOLOCK)
WHERE TBL_MSG_LATEST.STATUS = 1
)
SELECT * FROM Posts (NOLOCK)
…引发此错误:
Msg 215,16级,状态1,第6行
为不是函数的对象“Posts”提供的参数。如果参数用作表提示,则需要WITH关键字
在帖子之后删除(NOLOCK)
会让我的数据库感到高兴
我不熟悉SQL Server,所以我不完全了解CTE,但我相信在这里可能根本不需要这个NOLOCK
然而,我们不喜欢仅仅为了满足我的开发环境而对代码库进行更改
我的新数据库环境在配置上有差异吗?是否有正当理由删除我无法从错误消息中破译的NOLOCK
从本页:
省略WITH关键字是不推荐使用的功能,将被删除
在Microsoft SQL Server的未来版本中
因此,这将起作用
WITH Posts AS (
SELECT TOP 10 *
FROM TBL_MSG_LATEST WITH (NOLOCK)
WHERE TBL_MSG_LATEST.STATUS = 1
)
SELECT * FROM Posts WITH (NOLOCK)
不知道这是不是一个好主意,或者它是否有任何效果。这似乎是特定于CTE语法的。添加“WITH”不会改变NOLOCK的工作方式;它只会让它工作
使用CTE中的NOLOCK提示,这两种方法都有效:
WITH Posts AS (
SELECT ... FROM TBL_MSG_LATEST NOLOCK
)
SELECT * FROM Posts NOLOCK;
WITH Posts AS (
SELECT ... FROM TBL_MSG_LATEST WITH (NOLOCK)
)
SELECT * FROM Posts WITH (NOLOCK);
但这失败了:
WITH Posts AS (
SELECT ... FROM TBL_MSG_LATEST (NOLOCK)
)
SELECT * FROM Posts (NOLOCK);
这些都在CTE之外工作:
SELECT ... FROM TBL_MSG_LATEST NOLOCK;
SELECT ... FROM TBL_MSG_LATEST (NOLOCK);
SELECT ... FROM TBL_MSG_LATEST WITH (NOLOCK);
正确的语法是“WITH(NOLOCK)”
但是。。。如果您将NOLOCK置于CTE内,为什么还要将其置于SELECT上
请注意,在Denali CTP3中,结果都是相同的。如果没有很好的理由,NOLOCK可能只能用于报告等实例……否则您可能会读取未限制的数据……在这种情况下,我们可以证明您对代码所做的更改是合理的,谢谢。