Known Issue: ストアドプロシージャ実行時にエラー 602 が発生する。


SQL Server Support Team

SQL Server 2012 Service Pack 1 をご利用の環境において、ストアドプロシージャ実行時にエラー 602 が発生する場合があります。

この現象について、早急に情報を公開する目的で本ブログ記事を公開しています。

 

現象

SQL Server 2012 Servce Pack 1 を利用する環境で、ストアドプロシージャ実行時に、エラー602 が発生する場合があります。同環境で同一ストアドプロシージャを実行した場合でも、エラーが発生しない場合もあります。この事象は、 SQL Server 2012 Service Pack 1 の不具合に起因しています。
エラー602 は下記のメッセージとなります。

—-
 パーティション ID が %1! のテーブルまたはインデックスのエントリが、データベース %2! に見つかりませんでした。このエラーは、削除されたテーブルをストアド プロシージャが参照している場合、またはメタデータが壊れている場合に発生する可能性があります。ストアド プロシージャを削除して再作成するか、DBCC CHECKDB を実行してください。
—-

なお、以下の操作実行時に不具合に遭遇する可能性が高まります。

  •  ストアドプロシージャ内でローカル一時テーブルが作成および削除され、そのストアドプロシージャがひとつのセッション内で繰り返し呼び出される。
  •  SQL Server 内でキャッシュされている実行プラン内に、前回の実行時に作成されたローカル一時テーブルに関する情報が残っており、その情報が参照された。
  •  高スペックなマシン (多数の CPU を搭載するマシン) を利用している。(*)

(*) 厳密的には CPU 数に依存しませんが、SQL Server がマルチスレッドで動作した際の処理タイミングが現象の発生条件の引き金となるため、発生頻度を上げる要素となります。

対処策


次のいずれかの対処策があります。


A.  
ストアドプロシージャ実行時に毎回リコンパイルされるように設定する

キャッシュされている実行プラン内の情報を参照することでエラーが発生します。そのため、ストアドプロシージャ実行時にキャッシュされた実行プランを使用せず毎回リコンパイルされるように設定することで、エラーの発生を防ぐことができます。具体的には、WITH RECOMPILE オプションを追加してストアドプロシージャを再作成します。

例) WITH RECOMPILE オプションを追加したストアドプロシージャの作成 (ストアド プロシージャの再コンパイル)

 

CREATE PROCEDURE dbo.uspProductByVendor @Name varchar(30) = ‘%’

WITH RECOMPILE

AS

SET NOCOUNT ON;

SELECT v.Name AS ‘Vendor name’, p.Name AS
‘Product name’

FROM Purchasing.Vendor AS v

JOIN Purchasing.ProductVendor AS pv

ON v.BusinessEntityID =
pv.BusinessEntityID

JOIN Production.Product AS p

ON pv.ProductID =
p.ProductID

WHERE v.Name LIKE @Name;

GO

 

B.  一時テーブルを使用しないようにストアドプロシージャを変更する

ストアドプロシージャで一時テーブルを使用しないように変更します。ストアドプロシージャが同時実行される場合のテーブル名の競合等を考慮した変更等が必要となり、既存のストアドプロシージャが存在する場合、ストアドプロシージャの実装変更が必要となります。

A. のWITH RECOMPILE オプションの追加であれば、対象ストアドプロシージャ自体や呼び出し元ストアドプロシージャ、アプリケーション等を修正せずにエラーを回避できますので、回避のための作業量を最小に抑えることができます。コンパイルによる負荷上昇は無視できる可能性が高いと想定していますが、該当環境において十分なテストを実施するようにしてください。

※ 本対処策は現時点(2015/05/22) における情報となります。現在、上記問題の修正を含めて検討を進めておりますため、新たな情報が分かり次第、本ブログの記事も更新する予定です。

 

2015/09/30 追記

本不具合に対する修正プログラムが、SQL Server 2012 SP2 CU 8 にてリリースされました。下記よりダウンロード可能です。

SQL Server 2012年の SP2 用の累積的な更新プログラム 8

https://support.microsoft.com/ja-jp/kb/3082561


また、本不具合についての公開技術情報 (KB) も下記にございます。

FIX: Error 602 when you run a stored procedure repeatedly in SQL Server 2012

https://support.microsoft.com/ja-jp/kb/3080209

 

 

 

 

Comments (1)

  1. EngineerA より:

    本事象はServicePack2では発生しないと考えてよいでしょうか?

Skip to main content