比较以下存储过程:
CREATE PROCEDURE testProc1
AS
SELECT * INTO #temp FROM information_schema.tables
SELECT * FROM #temp
GO
CREATE PROCEDURE testProc2
AS
EXEC('SELECT * INTO #temp FROM information_schema.tables')
SELECT * FROM #temp
GO
现在,如果我跑testProc1
,它有效,并且#temp
似乎只在该通话期间存在。然而,testProc2
似乎根本不起作用,因为我得到了Invalid object name '#temp'
而是错误消息。
为什么有区别,以及如何使用临时表SELECT * INTO
源表名是否是存储过程的参数并且可以具有任意结构?
请注意,我使用的是 Microsoft SQL Server 2005。
来自博尔:
本地临时表可见
仅在当前会话中......
临时表会自动生成
当它们超出范围时掉落,
除非使用 DROP 明确删除
桌子
第一个过程和第二个过程之间的区别在于,在第一个过程中,表是在与其选择的相同范围内定义的;在第二个中, EXEC() 在其自己的范围内创建表,因此在这种情况下选择失败......
但请注意,以下方法可以正常工作:
CREATE PROCEDURE [dbo].[testProc3]
AS
SELECT * INTO #temp FROM information_schema.tables
EXEC('SELECT * FROM #temp')
GO
它之所以有效,是因为 EXEC 的范围是存储过程范围的子级。当表在父作用域中创建时,它也存在于任何子作用域中。
为了给您一个好的解决方案,我们需要更多地了解您要解决的问题...但是,如果您只需要从创建的表中进行选择,那么在子范围中执行选择就可以了:
CREATE PROCEDURE [dbo].[testProc4]
AS
EXEC('SELECT * INTO #temp FROM information_schema.tables; SELECT * FROM #temp')
GO
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)