将临时表重命名为物理表

时间:2011-09-26 08:35:07

标签: sql sql-server sql-server-2008

我可以这样做吗?

create table #tbl_tmp (col1 int)

insert into #tbl_tmp select 3

exec sp_rename '#tbl_tmp','tbl_new'

4 个答案:

答案 0 :(得分:9)

据我所知,这不可能在tempdb之外。

您可以从临时表创建一个新表,而不是重命名表。

未测试:

SELECT * 
INTO tbl_new
FROM #tbl_tmp

答案 1 :(得分:8)

没有

如果您从tempdb以外的数据库运行

  

当前没有找到名称为'#tbl_tmp'的项目   数据库....

这并不奇怪,因为所有数据页面等都在tempdb数据文件中,因此您无法将其重命名为突然变成其他数据库中的永久表。

如果您从tempdb开始运行

  

为过程指定了无效的参数或选项   'sys.sp_rename'。

如果您执行EXEC sp_helptext sp_rename并查看定义,则禁用相关的代码位

--------------------------------------------------------------------------  
 --------------------  PHASE 32:  Temporay Table Isssue -------------------  
 --------------------------------------------------------------------------  
 -- Disallow renaming object to or from a temp name (starts with #)  
 if (@objtype = 'object' AND  
  (substring(@newname,1,1) = N'#' OR  
  substring(object_name(@objid),1,1) = N'#'))  
 begin  
  COMMIT TRANSACTION  
  raiserror(15600,-1,-1, 'sys.sp_rename')  
  return 1  
 end  

为什么不首先创建一个永久表,然后重命名?

答案 2 :(得分:2)

#tbl_tmptbl_new是两个不同的对象:#tbl_tmp存储在tempdb系统数据库中,tbl_new(通常)存储在用户数据库中。

所以:

  1. 将临时表重命名为标准表可以假设将该对象从源数据库传输到另一个数据库。
  2. 将临时表重命名为标准表意味着您要将对象从一种类型转换为另一种类型(在这两种情况下,type(来自sys.objects视图)都是U,但因为SQL Server表现不同我觉得认为这两个对象有不同的类型是正确的。这就像通过重命名将临时表转换为表变量一样。
  3. 在这两种情况下,我都认为不能仅使用sp_rename执行此操作。

答案 3 :(得分:0)

答案是肯定的。你可以实现类似的东西,但是以一种变通方式。 尝试以下方法,一个小老学校,但绕过限制。我自己也测试过它

/* Create an empty temporary staging table **/
use aw_08r2
go
-- create temporary table
select * into #temp from person.address 

-- select data from temporary staging table
select * from #temp

-- convert the temporary table and save as physical table in tempdb
select * into tempdb.dbo.test from #temp

-- save a copy of the physical table from tempdb in aw_08r2
select * into person.test from tempdb.dbo.test

-- select data from physical table
select * from #temp
select * from tempdb.dbo.test
select * from person.test

-- drop temporary table and physical table from tempdb
drop table #temp
drop table tempdb.dbo.test
go