2011-09-26 60 views

回答

6

如果是從比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 

你爲什麼不只是創建擺在首位永久表然後做重命名?

+0

是的,我意識到,爲了能夠調用sp_rename表必須有,而臨時表相關的OBJECT_ID沒有之一。 –

+1

@CoroveiAndrei - 他們做的。嘗試'使用tempdb;選擇object_id('#tbl_tmp')'或從另一個數據庫上下文'select object_id('tempdb ..#tbl_tmp')' –

8

據我所知,這是不可能的tempdb之外。

不是重命名錶格,而是從臨時表格創建一個新表格。

未測試:

SELECT * 
INTO tbl_new 
FROM #tbl_tmp 
+0

是的,我知道這個,但我試圖使用sp_rename。 –

+0

@MartinSmith - 但它_does_給出了一個不同的選擇。 – Oded

+1

@MartinSmith - 謝謝你指出我原來的錯誤。 – Oded

2

#tbl_tmptbl_new是兩個不同的對象:#tbl_tmp存儲在tempdb系統數據庫和tbl_new(通常)存儲在一個用戶數據庫中。

所以:

  1. 重命名一個臨時表,以標準表可以假設從源數據庫對象轉移到另一個數據庫。
  2. 重命名一個臨時表,標準表意味着你要的對象從一種類型轉變成另一種類型(在兩種情況下type(從sys.objects中查看)是U,但由於SQL Server行爲不同,我認爲是正確的認爲這兩個對象有不同的類型)。這就像通過重命名將臨時錶轉換爲表變量。

在這兩種情況下,我認爲不可能僅使用sp_rename來執行此操作。

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