【发布时间】:2016-09-29 17:52:35
【问题描述】:
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 之外可见?
【问题讨论】:
-
仅供参考:如果对象在 tempdb.sys.objects 中有条目,即使在 scope.querying 系统目录可能提供更多信息之后,我们也能看到这一点
标签: sql sql-server tsql stored-procedures sql-server-2012