2011-01-21 1 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

+0

Вам действительно нужно переименовать их? Вы можете использовать псевдоним столбца, когда вы запрашиваете таблицу вместо этого. –

+0

@Mikael - Если столбцы таблицы temp не исправлены, которые по-прежнему нуждаются в динамическом SQL, это необязательно будет более удобным. Одно место, где они могут быть не исправлены, было бы, если бы временная таблица была создана путем создания 'SELECT INTO .. ​​# temp' из файла CSV, предоставленного третьей стороной. Я предполагаю, что что-то вроде этого вполне может быть так, поскольку в противном случае было бы лучше всего просто создать таблицу с нужными именами столбцов! –

ответ

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

Спасибо. Я тестирую ваш код, чтобы узнать, работает ли он на меня. – Walid

+0

+1 еще есть QUOTENAME;). Любая причина, по которой вы указываете quote_character с 'Descr', но не с' name'? –

+1

@Lieven - я удалил исходный ответ как тестирование с именами столбцов, содержащих '' 'или'] 'Я все еще не был уверен, что у меня все получилось. –

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]%' 
+0

Спасибо за ваше предложение, и оно действительно работает. Как я могу запустить его динамически в моей хранимой процедуре? – Walid

+1

Как и мой удаленный ответ, это уязвимо для SQL-инъекции. Безопаснее просто использовать цикл while или курсор. –

 Смежные вопросы

  • Нет связанных вопросов^_^