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

私はこのT-SQLステートメントを持っていますが、SQL ServerとOracleの両方に1つのステートメントを使用する必要があります。もちろん、 "with(nolock)"はOracleによって認識されません。両方のデータベースで実行されるこのステートメントを持つ方法はありますか? Oracleが "with(nolock)"を無視するか、ステートメントのこの部分または方法を使用しているSqlserverのみを無視するか、または両方を理解してコード化します。OracleとTSQLステートメントNO LOCK

No lockを使用している理由は、複数のユーザーが同じテーブルにアクセスしているため、トランザクション中に最大値を見つける必要があるためです。

Oracleは少し違ったことをするので、テーブルロックについて心配する必要はありません。

+0

なぜ1つのクエリが必要ですか?これらのデータベースが同じ言語を使用していない場合は、2つのクエリが必要です。 – GolezTrol

+0

NOLOCKはまったく必要ありません。あなたがそうした場合、あなたのMAXは矛盾するかもしれません。 – gbn

+0

1つのアプリケーションの異なる接続文字列 – icecurtain

答えて

5

あなたの質問はさまざまなことを行っています。問合せのセマンティクスとは何ですか? SQL Serverのバージョンが示すように、コミットされていないトランザクションの影響を含むmax(Key)を返すことになっていますか?そうならば

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

同じセマンティクスです。 構文は両方のAFAIKで正常に動作するはずです。

最後にコミットしたmax(Key)を変更する必要がある場合は、デフォルトで読み取りコミットされたスナップショットの分離を使用するようにSQL Serverデータベースを変更する必要があります。あるいは、ROWLOCK,READPASTのヒントで同様のセマンティクスを達成できますが、次に2つの異なるクエリが必要になります。

+0

UNCOMMITTED only COMMITTEDはOracleで利用可能です。これは、SQL Serverのsit waitingで解放されるロックが返されます。不一致なデータは問題ありません。私はまた、読み取り専用の同じ結果待ちのロックを使用しようとしました。 – icecurtain

+0

@icecurtain - ああ、オラクルが「不合格」をサポートしていないことに気付かなかった。 SQL Serverではスナップショットの分離を使用するか、2つの異なるクエリを使用する必要があります。 –