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
以外可见?
FYI:如果对象在tempdb.sys.objects项,我们都能够看到这甚至在scope.querying系统目录后可能提供更多信息 – TheGameiswar