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'.
今度は、ストアドプロシージャと同じことを試してみましょう:
-- 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;
質問はなぜローカルの一時的なプロシージャが異なって動作し、EXEC
の外側に見えるのですか?
でEXEC()コンテキストに表示されます。オブジェクトはtempdb.sys.objectsにエントリを持っている場合、我々は見ることができますこれはscope.queryingの後でさえもシステムカタログがより多くの情報を提供するかもしれない – TheGameiswar