2

データベースのローカルバージョンを実行するために、SQL Server 2008 SP2をワークステーションにセットアップしました。本番データベースはSQL Server 2008 R2です。同僚がワークステーションでSQL Server 2005を実行しています。SQL Server 2008 SP2のCTEに関するNOLOCKのエラー

My DBは次のコードでエラーを投げますが、他のサーバーの同じDBの他のインスタンスはエラーなしでこのクエリを実行します。

WITH Posts AS (
    SELECT TOP 10 * 
    FROM TBL_MSG_LATEST (NOLOCK) 
    WHERE TBL_MSG_LATEST.STATUS = 1 
) 
SELECT * FROM Posts (NOLOCK) 

...このエラーがスローされます。

(NOLOCK)を削除

Msg 215, Level 16, State 1, Line 6 Parameters supplied for object 'Posts' which is not a function. If the parameters are intended as a table hint, a WITH keyword is required.

私のDBを幸せにPosts後。

私はCTEを完全に理解していませんが、このNOLOCKはここでも必要ではないかもしれません。

しかし私は、私の開発環境を満たすためにコードベースを変更することに満足していません。

新しいDB環境との設定に違いはありますか?エラーメッセージから解読できないNOLOCKを削除する正当な理由はありますか?このページから

+2

NOLOCKはおそらくレポートなどのインスタンスでのみ使用するべきです...そうでないと、コミットされていないデータを読み取る可能性があります。 –

答えて

4

http://msdn.microsoft.com/en-us/library/ms187373.aspx

Omitting the WITH keyword is a deprecated feature and will be removed in a future version of Microsoft SQL Server.

だから、これは動作します。

WITH Posts AS (
    SELECT TOP 10 * 
    FROM TBL_MSG_LATEST WITH (NOLOCK) 
    WHERE TBL_MSG_LATEST.STATUS = 1 
) 
SELECT * FROM Posts WITH (NOLOCK) 

良いアイデアであるかどうか、または効果があるかどうかはわかりません。

+1

その場合、コードに変更を加えることを正当化することができます。 – markd

1

これはCTE構文に固有のようです。 「WITH」を追加しても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); 

が、これは失敗します:CTEは、これらの仕事の両方で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に入れていますか?

デナリCTP3の結果はすべて同じです。

関連する問題