2015-08-03 4 views
2

У меня есть две таблицы Таблица A и B Таблицаотображение строки с именами столбцов в SQL

А.

channelname variablename 
------------------------------ 
TCO1   INPUT CHANNEL 
TC02   OUTPUT CHANNEL 
TCO3   TEST CHANNEL 

Б.

TC01 TC02 TC03 
-------------------- 
100  443 322 
200  566 990 
376  453 342 
45  422 856 

Я хочу вывод таблицы В, как:

inputchannel outputchannel testchannel 
--------------------------------------------- 
100   443    322 
200   566    990 
376   453    342 
45    422    856 
+0

трудно понять вашу проблему, если вы не форматировать таблицы –

+0

я форматировал его в текстовом поле, но когда я опубликовать его в форматирование разрушено. –

+0

Вы используете MS SQL? или другой SQL? –

ответ

0

Необходимо использовать курсор, если вы не используете Чтобы изменить имя столбца: что-то вроде:

 
    Declare @sSQL as varchar(400) -- You can alway make it larger 
    Declare @channelname as varchar(50) -- You can alway make it larger 
    Declare @variablename as varchar(50) -- You can alway make it larger 
    Set @sSQL='' 
    DECLARE col_cursor CURSOR FOR 
    select c.name, a.variablename from 
    sys.columns c 
    inner join sys.tables t on c.object_id = t.object_id 
    inner join [A] as a on a.channelname = c.name 
    where t.name = 'B' 
    OPEN col_cursor 
    FETCH NEXT FROM col_cursor 
    INTO @channelname, @variablename 
    WHILE @@FETCH_STATUS = 0 
    BEGIN 
     If @sSQL='' 
     BEGIN 
      Set @sSQL='select [' + @channelname + ']as[' + @variablename + '] ' 
     END 
     ELSE 
     BEGIN 
      Set @sSQL= @sSQL + ',[' + @channelname + ']as[' + @variablename + '] ' 
     END 
     FETCH NEXT FROM col_cursor 
     INTO @channelname, @variablename 
    END 
    CLOSE col_cursor 
    DEALLOCATE col_cursor 
    Set @sSQL= @sSQL + ' from [B]' 
    Exec(@sSQL) 
0

, потому что люди не любят курсоров:

declare @var nvarchar(max) = N'create table ##temp (' 
select @var = @var + variablename + ' varchar(max),' from TableA 
set @var = LEFT(@var, LEN(@var) - 1) + ')' 

execute sp_executesql @var 

insert into ##temp 
select * from TableB 

select * into TableNew from ##temp 
drop table TableB 

EDIT теста это, конечно, прежде чем упасть любые таблицы.

0

Согласно комментарию:

я хочу, чтобы создать один запрос, чтобы переименовать все столбцы. - Орсон DCunha

Пожалуйста, попробуйте что-то вроде этого:

declare @columnNameFrom nvarchar(100), @columnNameTo nvarchar(100) 
declare @tablename nvarchar(100) 

SET @tablename = 'B' 

DECLARE rename_cursor CURSOR FOR 
    select @tablename + '.' + c.name 
    ,  A.variablename 
    from syscolumns c 
      inner join sysobjects o on o.id = c.id 
      inner join A on A.channelname = c.name 
    where o.name = @tablename 

OPEN rename_cursor 
FETCH NEXT FROM rename_cursor 
INTO @columnNameFrom, @columnNameTo 
WHILE @@FETCH_STATUS = 0 
BEGIN 
    SET @columnNameTo = REPLACE(@columnNameTo, ' ', '') 
    EXEC sp_executesql N'exec sp_rename @NameFrom, @NameTo' 
    , N'@NameFrom nvarchar(100), @NameTo nvarchar(100)' 
    , @columnNameFrom, @columnNameTo; 

    FETCH NEXT FROM rename_cursor 
    INTO @columnNameFrom, @columnNameTo 
END 
CLOSE rename_cursor 
DEALLOCATE rename_cursor ; 
Смежные вопросы