临时存储过程范围

时间:2016-05-31 15:56:19

标签: sql sql-server tsql stored-procedures sql-server-2012

SQL Server支持临时表(本地和全局)。

使用dynamic-SQL(EXECdbo.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之外可见?

1 个答案:

答案 0 :(得分:0)

它在exec之外保留它的原因是因为SQL Server可以重用proc的查询计划。

一旦定义了会话(通过执行),proc就会消失。

MS非常谨慎地表明临时表' (一个带有一个#符号)是上下文的本地,对调用程序不可见。

请参阅: 您创建的任何表对

中的EXEC()上下文都是可见的
  

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