私は世界中の複数の地域で仕事をしています。実行されているリージョンとそのタイムゾーンによっては、ジョブが実行されない場合があります。 GOTO
を使用して最後に到達し、時間と完了のためにスキップされたと報告します。
これは問題なく実行されます。
問題:procのさらに下のリンクサーバーに非常に大きな負荷がかかる場合があります。私たちはそれを知っており、それを避けることはできません-したがって、現時点ではリンクサーバーにクエリを送信しません。
しかし、クエリされたかのようにエラーが発生します。
リンクサーバーのOLE DBプロバイダー "SQLNCLI11"のスキーマ行セット "DBSCHEMA_TABLES_INFO"を取得できませんでした。メッセージ "未指定のエラー"が返されました。 [SQLSTATE 01000](エラー7412)OLEリンクサーバーのDBプロバイダー "SQLNCLI11"がメッセージ "クエリタイムアウトの期限切れ"を返しました。 [SQLSTATE 01000](エラー7412)。ステップは失敗しました。
リンクサーバーは、このスキーマチェックがタイムアウトになる原因となるプロシージャの開始時に検証されますか?
これは推測ですが、負荷の高い状態でリンクサーバーの遅延スキーマ検証を有効にしてみます。
EXEC master.dbo.sp_serveroption @server=N'Linked_Server_name', @optname=N'lazy schema validation', @optvalue=N'true'
このオプションがデフォルト値であるfalseに設定されている場合、SQL Serverは、リモートテーブルでのコンパイル以降に発生したスキーマの変更をチェックします。このチェックはクエリの実行前に行われます。スキーマに変更がある場合、SQL Serverは新しいスキーマを使用してクエリを再コンパイルします。
このオプションをtrueに設定すると、リモートテーブルのスキーマチェックは実行まで遅延されます。これにより、リモートテーブルのスキーマがクエリのコンパイルと実行の間で変更された場合、分散クエリがエラーで失敗する可能性があります。
リンクサーバー自体にクエリを実行するときに、リンクサーバーのメタデータのみをチェックします。
別の回避策は、動的SQLステートメントを使用してリンクサーバーにクエリを実行することです。
DECLARE @SQL nvarchar(max)
IF (Linked Server not under heavy load = true)
BEGIN
SET @SQL =
N'SELECT * FROM OPENQUERY(LinkedServer,''SELECT * FROM master.sys.databases'')'
EXEC SP_EXECUTESQL @SQL
END