#TempTables的范围仅限于EXEC声明?

时间:2010-09-09 10:39:30

标签: sql-server exec temp-tables

试试这个

use master
go

select * into #TempTable from sys.all_views 
select * from #TempTable
drop table #TempTable

exec('
select * into #TempTable2 from sys.all_views 
')
/* This will give error: */
select * from #TempTable2

我意识到#TempTable2不可访问...因此在EXEC语句中使用select into #TempTable语法意味着在exec语句完成时表会被自动销毁?

3 个答案:

答案 0 :(得分:3)

你可以用

看到这个
exec('
select * into #TempTable2 from sys.all_views 
select * from tempdb.sys.tables
')
select * from tempdb.sys.tables

如果您希望以后能够访问临时表,可以使用##global临时表。 e.g。

use master
go
declare @temptablename char(40)

set @temptablename = '[##' + cast(newid() as char(36)) + ']'

exec('
select * into ' + @temptablename + ' from sys.all_views 
')
/* Do some other stuff: */

exec('
select * from ' + @temptablename)

答案 1 :(得分:1)

您可以创建全局临时表

create table ##TempTable (
    /* Structure goes here */
)

exec('insert into ##TempTable(/*Columns*/) select * from sys.all_views')

select * from ##TempTable

(如果这样做,并且您的代码可能被多个用户使用,那么在临时表中包含一个SPID列,在选择列表中包含@@ SPID,并将最终选择更改为SPID = @@ SPID)

答案 2 :(得分:1)

是的,你是对的。 Exec语句中的临时表只能在该语句中访问。

如果在SSMS中打开两个窗口并在一个窗口中创建一个临时表,则无法通过另一个窗口访问它,因为它是一个不同的连接。

但是,如果您创建全局临时表,则可以访问它。全局临时表使用双##而不是一个来定义。

有关于临时表的文章here from SQLTeam以及here from MSDN