簡體   English   中英

SQL Server 2008 SP2 中 CTE 上的 NOLOCK 錯誤

[英]Error from NOLOCK on CTE in SQL Server 2008 SP2

我剛剛在我的工作站上設置了 SQL Server 2008 SP2來運行本地版本的數據庫。 生產數據庫是 SQL Server 2008 R2 一位同事正在他的工作站上運行 SQL Server 2005。

我的數據庫使用以下代碼引發錯誤,而其他服務器上同一數據庫的其他實例運行此查詢而沒有錯誤。

WITH Posts AS (
    SELECT TOP 10 *
    FROM TBL_MSG_LATEST (NOLOCK)
    WHERE TBL_MSG_LATEST.STATUS = 1
) 
SELECT * FROM Posts (NOLOCK)

...引發此錯誤:

消息 215,級別 16,State 1,第 6 行為 object“帖子”提供的參數不是 function。 如果將參數用作表提示,則需要 WITH 關鍵字。

Posts之后刪除(NOLOCK)讓我的數據庫很開心。

我不熟悉 SQL 服務器,所以我不完全了解 CTE,但我相信這里甚至可能不需要這個NOLOCK

但是,我們並不樂意僅僅為了滿足我的開發環境而對代碼庫進行更改。

我的新數據庫環境有配置差異嗎? 是否有正當理由刪除我無法從錯誤消息中破譯的NOLOCK

從這個頁面: http://msdn.microsoft.com/en-us/library/ms187373.aspx

省略 WITH 關鍵字是一項已棄用的功能,將在 Microsoft SQL 服務器的未來版本中刪除。

所以這會起作用。

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 中的結果都相同。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM