[英]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.