2014-02-18 61 views
2

我試圖把一個與更新查詢(NOLOCK):更新查詢使用NOLOCK提示

UPDATE pth_patchLookup with(nolock) SET ScanDateTime = Getdate() WHERE RegID = 312 

,但我得到了以下信息:

NoLock hint is supported only with Select statement and not with update, insert and delete. 

是否有任何的方式,其中我可以在這個更新查詢應用「NOLOCK」?

感謝所有幫助

+2

通常'(NOLOCK)'通常不是你想要的......有副作用可能會讓你感到驚訝。 'READ COMMITTED SNAPSHOT ISOLATION'可能會更好地向您提供您(可能)想要的內容,但它需要更改數據庫。請參閱[本文](http://www.brentozar.com/isolation-levels-sql-server/)瞭解更多信息。 – bhamby

+0

你想達到什麼目的? – GarethD

+0

@GarethD當有多個實例更新表時,有一個死鎖發生(SQL錯誤1205) –

回答

1

(NOLOCK)禁用共享鎖而不是獨佔鎖。 您可以使用讀取提交隔離級別來爲選擇語句設置排它鎖。

SET TRANSACTION ISOLATION LEVEL READ COMMITTED 
UPDATE pth_patchLookup SET ScanDateTime = Getdate() WHERE RegID = 312 
+2

這會得到相同的錯誤 - '僅使用Select語句支持NoLock提示,不支持更新,插入和刪除。' – GarethD

+0

對不起,我編輯了它。 –

0

NOLOCK是一個選擇(只)暗示,這是太大的壞習慣形式年長程序員,因爲它在SQL Server 7,但由於SQL Server 2000中它是最不必要幾乎是強制性的。 這個提示特別告訴引擎,即使select處於一個uncommited事務的中間,select也可以讀取行。由於這個原因,你可能會遇到髒或鬼的讀取。

我強烈建議您閱讀有關隔離級別以瞭解如何滿足特定系統要求。

0

而這個?

UPDATE TOP (1000) v 
SET idSupervisor = a.supervisor 
FROM dbo.Venda_2014 v WITH (NOLOCK) 
INNER JOIN #supervidores_presentes a WITH (NOLOCK) ON v.IdVendedor = a.vendedor AND v.idEmpresaOriginal = a.empresa 
WHERE IdDistribuidor IN (40) 
     AND ISNULL(v.idSupervisor,0) = 0 
     AND datAnoMesRef >= '201501' 
Go 

對我來說工作很好。