2011-01-21 39 views
1

我有一個#TempTble它看起來像這樣:環流式與重命名#TEMP表列

Col1,Col2,5,8,19,.... 

而且,我有另一種描述表中的鑰匙,#TempTble匹配:

key Descr  
=== ====  
5  Descr1  
8  Descr2  
19 Descr3 

這是最好的方式來遍歷#TempTble並與匹配的描述重新命名其列,所以它看起來是這樣的:

Col1,Col2,Descr1,Descr2,Descr3,... 

提前致謝。

+1

是否臨時表中有值5,8,19一列?還是它有名爲5,8,19的列? – Andomar 2011-01-21 13:23:17

+0

你真的需要重命名它們嗎?當您查詢表格時,您可以使用列別名。 – 2011-01-21 13:39:25

+0

@Mikael - 除非臨時表列固定,仍然需要動態SQL,所以不一定更方便。如果臨時表是通過從第三方提供的CSV文件中執行`SELECT INTO ..#temp`創建的,那麼它們可能不會被修復。我假設類似的情況可能是這樣,否則當然最好是簡單地創建具有所需列名的表! – 2011-01-21 13:59:53

回答

3
IF object_id('tempdb..#Temp') IS NOT NULL DROP TABLE #Temp 

declare @map table ([key] sysname,Descr sysname) 

INSERT INTO @map 
select 5,'Descr1' UNION ALL 
select 8,'Descr2' UNION ALL  
select 19,'Descr3' 

create table #Temp ([Col1] int,[Col2] int,[5] int,[8] int,[19] int) 

DECLARE @name nvarchar(1035), @descr sysname; 

DECLARE ColumnCursor CURSOR 
LOCAL FORWARD_ONLY STATIC READ_ONLY TYPE_WARNING 
FOR SELECT 'tempdb..#Temp.' + QUOTENAME(name), Descr 
FROM tempdb.sys.columns 
JOIN @map m ON m.[key]=name 
where object_id=object_id('tempdb..#Temp'); 

OPEN ColumnCursor; 
FETCH NEXT FROM ColumnCursor INTO @name, @descr; 
WHILE @@FETCH_STATUS = 0 
BEGIN; 
EXECUTE tempdb..sp_rename @name, @descr,'COLUMN'; 
FETCH NEXT FROM ColumnCursor INTO @name, @descr; 
END; 
CLOSE ColumnCursor; 
DEALLOCATE ColumnCursor; 

SELECT * FROM #Temp 
0

這是一個不好的設計 一種選擇是運行這段代碼,複製結果,並再次運行

select 'exec tempdb..sp_rename ''#temp.['+t1.name+']'','''+t2.descrip+'''' 
from tempdb..syscolumns as t1 inner join mytable as t2 on t1.name=t2.[key] 
where id=OBJECT_ID('tempdb..#temp') and t1.name like '[0-9]%'