次の関数を想定します。
_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)
を機能させることをお勧めします。これは可能ですか?
関数内のコードのすべてのテーブルに配置しない限り、テーブル値関数でWITH (NOLOCK)
を使用することはできません。
あなたの最善の策は、あなたが言ったように、SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
になるでしょう。
これをデフォルトに戻すには、(上記の変更前に)現在設定されている分離レベルを確認する必要があります。
これは、DBCC USEROPTIONS
を実行し、isolation level
の値を確認することで実行できます。
デフォルトはREAD COMMITTED
になる傾向があるため、これに変更するには、次のようなステートメントを記述します。
SET TRANSACTION ISOLATION LEVEL READ COMMITTED