试试这个
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语句完成时表会被自动销毁?
答案 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