web-dev-qa-db-ja.com

テーブル値関数を呼び出すときにNOLOCKヒントを使用する

次の関数を想定します。

_CREATE FUNCTION [dbo].[ufnTest]()
RETURNS TABLE
AS RETURN SELECT 1 AS Nr
_

私の実際の関数は、さまざまなテーブルから実際のデータを選択します。私は(ほとんど)nolockヒントを使用することのリスクを理解しており、この場合は実際にそれらが必要だと判断しました。だから私はこのような上記の関数を呼び出そうとします:

_SELECT * FROM [dbo].[ufnTest]() WITH(NOLOCK)
_

ただし、 これは失敗します で、次のメッセージが表示されます。

キーワード「with」付近の構文が正しくありません。このステートメントが共通テーブル式、xmlnamespaces句、または変更追跡コンテキスト句の場合、前のステートメントはセミコロンで終了する必要があります。

このエラーを修正するためのヒントは関係ありません。おそらく、このテーブルヒントはテーブル値関数では使用できないのでしょうか。

私が検討するいくつかの選択肢があります。 1つは、選択クエリのすべてのテーブルでヒントを使用することですが、(a)関数を変更するたびにこれを覚えておく必要があり、(b)反復的です。別の代替案は_SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED_ですが、欠点は、それを以前のワットに戻す方法がわからないことです(およびステートメントafterselect私のTVFからは、元の分離レベルが必要です)。

そのため、テーブル値関数からの選択に対してWITH (NOLOCK)を機能させることをお勧めします。これは可能ですか?

6
Jeroen

関数内のコードのすべてのテーブルに配置しない限り、テーブル値関数でWITH (NOLOCK)を使用することはできません。

あなたの最善の策は、あなたが言ったように、SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTEDになるでしょう。

これをデフォルトに戻すには、(上記の変更前に)現在設定されている分離レベルを確認する必要があります。

これは、DBCC USEROPTIONSを実行し、isolation levelの値を確認することで実行できます。

デフォルトはREAD COMMITTEDになる傾向があるため、これに変更するには、次のようなステートメントを記述します。

SET TRANSACTION ISOLATION LEVEL READ COMMITTED

9
Mark Sinkinson