2012-01-03 250 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