2016-09-29 64 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

您需要​​的数据。可以选择使用CROSS APPLYtable 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 - 然后只在“表值构造函数”中添加这些列 –

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; 
相关问题