2016-05-31 3 views
3

SQL Serverは、一時テーブル(ローカルおよびグローバル)をサポートします。一時ストアドプロシージャスコープ

ダイナミックSQL(EXECまたはdbo.sp_executesql)を使用すると、新しいコンテキストを作成してローカルテンポラリテーブルをダイナミックSQLブロックでのみ表示できますが、外部には表示されません。

-- Normal table 
EXEC ('CREATE TABLE tab(i INT); INSERT INTO tab(i) VALUES (1)'); 
SELECT * FROM tab; 

-- Global temporary table 
EXEC ('CREATE TABLE ##tab(i INT); INSERT INTO ##tab(i) VALUES (2)'); 
SELECT * FROM ##tab; 

-- Local temporary table 
EXEC ('CREATE TABLE #tab(i INT); INSERT INTO #tab(i) VALUES (3)'); 
SELECT * FROM #tab; 
-- Invalid object name '#tab'. 

LiveDemo

今度は、ストアドプロシージャと同じことを試してみましょう:

-- Normal procedure 
EXEC ('CREATE PROCEDURE my_proc AS SELECT 1 AS col;'); 
EXEC my_proc; 

-- Global temporary procedure 
EXEC ('CREATE PROCEDURE ##my_proc AS SELECT 2 AS col;'); 
EXEC##my_proc; 

-- Local temporary procedure 
EXEC ('CREATE PROCEDURE #my_proc AS SELECT 3 AS col;'); 
EXEC#my_proc; 

LiveDemo2

質問はなぜローカルの一時的なプロシージャが異なって動作し、EXECの外側に見えるのですか?

+0

でEXEC()コンテキストに表示されます。オブジェクトはtempdb.sys.objectsにエントリを持っている場合、我々は見ることができますこれはscope.queryingの後でさえもシステムカタログがより多くの情報を提供するかもしれない – TheGameiswar

答えて

0

SQL Serverがprocのクエリプランを再利用できるため、SQL Serverがexecの外部に保持される理由。

procは、(execを介して)定義されたセッションが閉じられるとすぐに消えます。

MSは、テンポラリテーブル(#記号が1つ)がコンテキストに対してローカルであり、呼び出しプログラムからは見えないことを示しています。

を参照してください:あなたが作成 任意のテーブルがFYI

https://technet.microsoft.com/en-us/library/aa175921%28v=sql.80%29.aspx

+0

docから正確な見積もりを提供できますか? 「SQL Serverがprocのクエリプランを再利用できるので、execの外部に保持する理由。 'WITH RECOMPILE 'を持つSPとはどういう意味ですか? – lad2025

+0

この引用文は、私が引用したURLから来ており、引用されたページの一番下の一言ではEXEC()というセクションにあります。 SQL Serverは、呼び出し元のユーザーが 'with recompile'を使用してアクティブである限り、procを継続して保持することを確立しているため、毎回SQL Serverを再コンパイルする必要がありますが、execの外部ではアクセスできます。 –