2016-09-29 2 views
3

У меня есть таблица с большим количеством столбцов, как:Как вставить строку в таблицу, выберите имя столбца и значения из другой таблицы в SQL Server

Таблица A:

ColumnA | ColumnB | ColumnC | ColumnD | ColumnE 
_______________________________________________ 
valueA | valueB | valueC | valueD | valueE 

Как я могу вставить в таблицу B, как показано ниже?

Таблица B:

ColumnName | ColumnValue 
_________________________ 
ColumnA  | valueA 
ColumnB  | valueB 
ColumnC  | valueC 
ColumnD  | valueD 
ColumnE  | valueE 

Спасибо!

ответ

1

Вы также можете использовать обычный UNPIVOT для этого.

Пример из таблиц с использованием переменных:

declare @TableA table (Id int identity(1,1), ColumnA int, ColumnB int, ColumnC int, ColumnD int, ColumnE int); 
declare @TableB table (ColumnName varchar(30), ColumnValue int); 

insert into @TableA (ColumnA, ColumnB, ColumnC, ColumnD, ColumnE) values 
(1,2,3,4,5); 

insert into @TableB (ColumnName, ColumnValue) 
select ColumnName, ColumnValue from @TableA 
unpivot (ColumnValue for ColumnName in (ColumnA, ColumnB, ColumnC, ColumnD, ColumnE)) unpiv; 

select * from @TableB; 

Возвращает:

ColumnName ColumnValue 
---------- ----------- 
ColumnA  1 
ColumnB  2 
ColumnC  3 
ColumnD  4 
ColumnE  5 
3

Необходимо, чтобы данные Unpivot. Один из вариантов использует CROSS APPLY и table valued constructor

SELECT ColumnName, 
     ColumnValue 
FROM Yourtable 
     CROSS APPLY (VALUES ('ColumnA',ColumnA), 
          ('ColumnB',ColumnB), 
          ('ColumnC',ColumnC), 
          ('ColumnD',ColumnD), 
          ('ColumnE',ColumnE))TC(ColumnName, ColumnValue) 
+0

использование CROSS APPLY подберет unnessary столбцы, вы знаете другой путь, так что я только выбрать определенные столбцы? Спасибо большое! – Snow

+0

@Snow - добавьте только те столбцы в 'table value constructor' –

1

Попробуйте с динамическим UNPIVOT:

DECLARE @COLS VARCHAR(MAX) = '' 
SELECT @COLS = @COLS + ', [' + COLUMN_NAME + ']' FROM [yourDBName].INFORMATION_SCHEMA.COLUMNS 
WHERE TABLE_NAME = 'TableA' 

DECLARE @ColumNames VARCHAR(MAX)= STUFF(@COLS, 1,1, '') 

DECLARE @Cmd VARCHAR(MAX) = ' 
SELECT * FROM 
(SELECT * FROM TableA) x 
UNPIVOT 
(
    [Value] FOR [Column] IN (' + @ColumNames + ') 
) UNPVT' 

INSERT INTO TableB 
EXEC (@Cmd) 
0

Использование UNPIVOT:

SELECT U.ColumnName,U.ColumnValue 
FROM @tblA A 
UNPIVOT 
(
    ColumnValue 
    for ColumnName in ([ColumnA], [ColumnB], [ColumnC],[ColumnD],[ColumnE]) 
) U; 
Смежные вопросы