2012-01-03 232 views
4
select max(Key) from MyTable with(nolock) 

我有這個T-SQL語句,但同時需要爲SQL Server和Oracle使用一個語句,當然「with(nolock)」不被Oracle識別。有沒有一種方法可以在兩個數據庫上運行此語句。通過Oracle忽略「with(nolock)」或者僅使用Sqlserver使用這部分語句或者一種方式或者編碼方式來理解。Oracle和TSQL語句NO LOCK

我之所以使用No lock是因爲多個用戶正在訪問同一個表,並且我需要在事務處理中查找最大值。

Oracle做的事情有點不同,所以我不必擔心表鎖。

+0

爲什麼你需要有一個查詢?如果這些數據庫不會說同一種語言,則需要兩個查詢。 – GolezTrol 2012-01-03 11:07:36

+0

根本不需要NOLOCK。如果你這樣做,你的MAX可能會不一致。 – gbn 2012-01-03 11:12:02

+0

一個應用程序不同的連接字符串 – icecurtain 2012-01-03 11:13:42

回答

5

您的查詢正在做不同的事情。查詢的語義應該是什麼?它是否應該返回max(Key),包括未提交事務的效果,因爲您的SQL Server版本指示?如果是這樣的話

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED; 
select max(Key) 
from MyTable; 

是相同的語義。 語法在兩個AFAIK上都應該正常工作。

如果您想要最後一次提交max(Key),則需要將SQL Server數據庫更改爲默認使用讀提交快照隔離,因此它的行爲與Oracle相似。或者,您也可以使用ROWLOCK,READPAST提示實現類似的語義,但是隨後您又回到需要兩個不同的查詢。

+0

UNCOMMITTED only COMMITTED在Oracle中可用這在SQL Server中的反應相同,等待鎖被釋放。髒不一致的數據很好。我也嘗試使用只讀相同的結果等待鎖定。 – icecurtain 2012-01-03 11:46:03

+0

@icecurtain - 啊沒有意識到Oracle不支持'UNCOMMITTED'。您需要在SQL Server中使用快照隔離,或者有2個不同的查詢。 – 2012-01-03 11:52:17