我可以这样做吗?
create table #tbl_tmp (col1 int)
insert into #tbl_tmp select 3
exec sp_rename '#tbl_tmp','tbl_new'
答案 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_tmp
和tbl_new
是两个不同的对象:#tbl_tmp
存储在tempdb
系统数据库中,tbl_new
(通常)存储在用户数据库中。
所以:
type
(来自sys.objects视图)都是U
,但因为SQL Server
表现不同我觉得认为这两个对象有不同的类型是正确的。这就像通过重命名将临时表转换为表变量一样。在这两种情况下,我都认为不能仅使用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