SQL Server
支持临时表(本地和全局)。
使用dynamic-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;
问题是为什么本地临时程序的行为有所不同,并且在EXEC
之外可见?
答案 0 :(得分:0)
它在exec之外保留它的原因是因为SQL Server可以重用proc的查询计划。
一旦定义了会话(通过执行),proc就会消失。
MS非常谨慎地表明临时表' (一个带有一个#符号)是上下文的本地,对调用程序不可见。
请参阅: 您创建的任何表对
中的EXEC()上下文都是可见的https://technet.microsoft.com/en-us/library/aa175921%28v=sql.80%29.aspx