我可以這樣做嗎?將臨時表格重命名爲物理表格
create table #tbl_tmp (col1 int)
insert into #tbl_tmp select 3
exec sp_rename '#tbl_tmp','tbl_new'
我可以這樣做嗎?將臨時表格重命名爲物理表格
create table #tbl_tmp (col1 int)
insert into #tbl_tmp select 3
exec sp_rename '#tbl_tmp','tbl_new'
如果是從比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
你爲什麼不只是創建擺在首位永久表然後做重命名?
#tbl_tmp
和tbl_new
是兩個不同的對象:#tbl_tmp
存儲在tempdb
系統數據庫和tbl_new
(通常)存儲在一個用戶數據庫中。
所以:
type
(從sys.objects中查看)是U
,但由於SQL Server
行爲不同,我認爲是正確的認爲這兩個對象有不同的類型)。這就像通過重命名將臨時錶轉換爲表變量。在這兩種情況下,我認爲不可能僅使用sp_rename
來執行此操作。
答案是肯定的。你可以實現類似的東西,但以一種解決方法。 嘗試下面的方法,一個小老頭,但繞過限制。我測試了它自己以及
/* 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
是的,我意識到,爲了能夠調用sp_rename表必須有,而臨時表相關的OBJECT_ID沒有之一。 –
@CoroveiAndrei - 他們做的。嘗試'使用tempdb;選擇object_id('#tbl_tmp')'或從另一個數據庫上下文'select object_id('tempdb ..#tbl_tmp')' –