我有以下代码来演示我的问题:
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'.
但#tmp2中的选择是成功的:
不同之处在于#tmp
是在存储过程中创建的,但是#tmp2
- 不是。
是否可以在存储过程中创建本地临时表,并在存储过程返回后继续使用它?
答案 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
全局临时表仍然存在......
话虽如此,使用像这样的全局临时表并不是一个好习惯。
答案 1 :(得分:1)
不,你不能。如您所见,您可以从内部范围访问外部表,但unfortunately:
存储过程中创建的本地临时表在存储过程完成时会自动删除 。该表可以由创建该表的存储过程执行的任何嵌套存储过程引用。调用创建表的存储过程的进程无法引用该表。
(我强调)
我通常的解决方法就是你已经在 - 在外部范围内创建临时表(#tmp2
)