1

実稼働 SQL2000 インスタンスには、数百のストアド プロシージャを含むデータベースがあります。その多くは、コードの「早い段階」で #TEMP テーブルを作成する手法を使用し、その後、さまざまな内部ストアド プロシージャがこの親 sProc によって実行されます。SQL2000 では、内部または「子」sProc は #TEMP への INSERT や #TEMP からのデータの選択に問題はありません。つまり、同じ接続を使用しているため、すべてこの #TEMP を参照できると思います。

SQL2008 でのテストでは、異なる動作の 2 つの症状が見つかりました。まず、設計時に、新しい "intellisense" 機能は、子 sProc の Management Studio EDIT で、#TEMP が "無効なオブジェクト名" であると不平を言っています。さらに悪いことに、実行時に、呼び出された親 sProc がネストされた子 sProc 内で失敗します。

解決策は、明らかに異なる接続から参照できるグローバル一時テーブルである ##TEMP に変更することであると誰かが提案しました。

これらの sProc が Web アプリケーションから呼び出された場合 (マルチユーザーの問題など)、すべての問題点を追跡するための作業量と、考えられる/可能性のある厄介な影響の両方から、これはあまりにも抜本的な提案のようです。

これは実際に #TEMP (ローカル一時テーブル) に関する SQL2005 または SQL2008 の動作の変更ですか? 2005 年はスキップしましたが、必要な修正を行う前に、なぜこれが発生するのかをより正確に知りたいと思います。ありがとう。

4

2 に答える 2

2

ストアド プロシージャ間で一時テーブルを共有するのは便利な機能です: http://www.sommarskog.se/share_data.html#temptables。おそらく、非常に単純な例を試して、それが機能するかどうかを確認する必要があります。それが機能する場合は、他の理由を調べ始めます。

管理スタジオのクエリ ウィンドウからこれを試してください。

次の 2 つのプロシージャを作成します。

CREATE PROCEDURE called_procedure 
(@par1 int, @par2 char(5))
AS
INSERT INTO  #tmp VALUES (@par1,@par2)
GO

CREATE PROCEDURE caller
AS

CREATE TABLE #tmp (col1 int     NOT NULL
                  ,col2 char(5) NULL
                  )
EXEC called_procedure 1, 'AAA'
EXEC called_procedure 2, 'BBB'

SELECT * FROM #tmp
GO

次にそれらを実行します。

exec caller

これは、SQL Server 2005 で取得したものです。

col1        col2
----------- -----
1           AAA  
2           BBB  

(2 row(s) affected)
于 2010-05-21T18:05:40.513 に答える
1

これを現在(2000、2005、および2008で)、ローカルからグローバルの一時テーブルに変更することなく、説明したとおりに行います。

于 2010-05-21T18:07:24.173 に答える