1

context_info を使用してグローバル変数をシミュレートしています。このコンテキストで使用します。

いくつかのバッチで構成されたスクリプトがあり、最初にグローバル変数を設定し (123例では)、すべてのバッチの後でその番号を使用してログ テーブルに入力します。

これで動作しますが、今日は 1 台のマシンで失敗しました。理由がわかりません。context_info が機能しない理由はありますか? 手動で置き換えようとしましcontext_info123が、スクリプトは成功しました。スクリプトは、Delphi アプリケーションから実行されました。

DECLARE @GlobalInteger binary(128)
SET @GlobalInteger =cast(123 as binary(128))
SET CONTEXT_INFO @GlobalInteger 
GO

BATCH 1
GO

...

BATCH N
GO

INSERT INTO TABLE_LOG VALUES (cast(context_info() as INT)
4

1 に答える 1

3

CONTEXT_INFOドキュメントにはいくつかの注意事項があります。

複数のアクティブな結果セット (MARS) を使用すると、アプリケーションは複数のバッチまたは要求を同じ接続で同時に実行できます。MARS 接続のバッチの 1 つで SET CONTEXT_INFO が実行されると、SET ステートメントと同じバッチで CONTEXT_INFO 関数が実行されると、新しいコンテキスト値が返されます。新しい値は、SET ステートメントを実行したバッチが完了した後に開始されない限り、接続上の 1 つ以上の他のバッチで実行される CONTEXT_INFO 関数によって返されません。

また、値を公開しているさまざまなビュー (sys.dm_exec_requests、sys.dm_exec_sessions、および CONTEXT_INFO 自体) に値がどのように伝達されるかについての説明もあります。セッション コンテキスト情報の使用 を参照してください。情報がすぐに表示される場所もあれば、バッチの完了後にのみ表示される場所もあります。

于 2010-07-13T16:58:51.907 に答える