Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server SQL Server 2008 SP2中CTE上的NOLOCK错误_Sql Server_Sql Server 2005_Sql Server 2008_Sql Server 2008 R2 - Fatal编程技术网

Sql server SQL Server 2008 SP2中CTE上的NOLOCK错误

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

我刚刚在工作站上设置了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
) 
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可能只能用于报告等实例……否则您可能会读取未限制的数据……在这种情况下,我们可以证明您对代码所做的更改是合理的,谢谢。