是否可以在存储过程中创建本地临时表,并在存储过程返回后继续使用它?

时间:2017-10-26 22:47:50

标签: sql-server stored-procedures

我有以下代码来演示我的问题:

CREATE TABLE #tmp2 (Id INT)
GO

IF OBJECT_ID('Test') IS NOT NULL 
   DROP PROCEDURE Test
GO

CREATE PROCEDURE Test
AS
BEGIN
    SELECT 0 Id 
    INTO #tmp

    INSERT INTO #tmp2 (Id) 
    VALUES (1)
END
GO

EXEC Test

SELECT * FROM #tmp2
SELECT * FROM #tmp

运行代码会产生以下消息:

(1 row(s) affected)

(1 row(s) affected)

(1 row(s) affected)

Msg 208, Level 16, State 0, Line 3
Invalid object name '#tmp'.

enter image description here

但#tmp2中的选择是成功的:

enter image description here

不同之处在于#tmp是在存储过程中创建的,但是#tmp2 - 不是。

是否可以在存储过程中创建本地临时表,并在存储过程返回后继续使用它?

2 个答案:

答案 0 :(得分:1)

有两种类型的临时表,一种名称以单#符号开头的本地临时表,另一种是名称以两个#符号开头的全局临时表:more details

无法在过程外部访问本地临时表,但您可以访问全局临时表。

CREATE TABLE #tmp2 (Id INT)
GO

IF OBJECT_ID('Test') IS NOT NULL DROP PROCEDURE Test
GO

CREATE PROCEDURE Test AS
BEGIN
  SELECT 0 Id INTO ##globalTemp
  INSERT INTO #tmp2 (Id) VALUES (1)
END
GO

EXEC Test
Go

SELECT * FROM #tmp2
SELECT * FROM ##globalTemp

全局临时表仍然存在......

enter image description here

话虽如此,使用像这样的全局临时表并不是一个好习惯。

答案 1 :(得分:1)

不,你不能。如您所见,您可以从内部范围访问外部表,但unfortunately

  

存储过程中创建的本地临时表在存储过程完成时会自动删除 。该表可以由创建该表的存储过程执行的任何嵌套存储过程引用。调用创建表的存储过程的进程无法引用该表。

(我强调

我通常的解决方法就是你已经在 - 在外部范围内创建临时表(#tmp2