将数据从一个表移动到具有不同表结构的其他表

时间:2014-05-19 10:21:49

标签: sql sql-server-2008 sqlbulkcopy

我正在创建一个通用数据上传应用,用户可以在其中创建表格结构并上传数据。

我有通用数据表。具有以下结构。

--------------------------------------
tableId | ColumName | rowNo | CellData 

现在,用户将为该模板创建模板并以csv格式上传数据。

假设用户创建了以下模板。

----------------------------------------
colum1 | colum2  | colum3 | colum4

并按如下方式插入数据

TemplateOne

colum1 | colum2  | colum3 | colum4
-----------------------------------
x1     |  x2     |  x3    |  x4   
A1     |  A2     |  A3    |  A4   
B1     |  B2     |  B3    |  B4   

我想将此数据移动到通用数据表中,如下所示。

   tableId  | ColumName | rowNo | CellData 
--------------------------------------
TemplateOne | colum1    |   1   | X1
TemplateOne | colum1    |   2   | A1
TemplateOne | colum1    |   3   | B1
TemplateOne | colum2    |   1   | X2
TemplateOne | colum2    |   2   | A2
TemplateOne | colum2    |   3   | B2
TemplateOne | colum3    |   1   | X3
TemplateOne | colum3    |   2   | A3
TemplateOne | colum3    |   3   | B3  
TemplateOne | colum4    |   1   | X4
TemplateOne | colum4    |   2   | A4
TemplateOne | colum4    |   3   | B4

我正在尝试为此开发动态sql。只是想知道是否有更简单的方法。

如果是,请建议。

2 个答案:

答案 0 :(得分:0)

如果我理解正确,您可以使用unpivot

select 'TemplateOne' as tableid, ColumnName, celldata
from TemplateOne
unpivot (celldata for ColumnName in (colum1, colum2, colum3, colum4)
        ) as unpvt;

要执行此操作,您需要使用动态SQL。

答案 1 :(得分:0)

我猜您可以使用INSERT INTO SELECT语句将数据从table1复制到table2

INSERT INTO table2 (col1,col2 ...)
SELECT col1,col2... FROM table1;

文件在这里:
http://www.w3schools.com/sql/sql_insert_into_select.asp

<小时/> 您的SQL可能是这样的:

INSERT INTO generic (tableId, ColumName,rowNo,CellData)
SELECT 'TemplateOne' AS tableId, 'colum1' AS ColumName, rowNo, colum1 AS CellData
FROM TemplateOne
UNION ALL
SELECT 'TemplateOne' AS tableId, 'colum2' AS ColumName, rowNo, colum2 AS CellData
FROM TemplateOne
UNION ALL
SELECT 'TemplateOne' AS tableId, 'colum3' AS ColumName, rowNo, colum3 AS CellData
FROM TemplateOne
UNION ALL
SELECT 'TemplateOne' AS tableId, 'colum4' AS ColumName, rowNo, colum4 AS CellData
FROM TemplateOne;

DEMO:http://sqlfiddle.com/#!2/f3e84a/1

希望这有帮助。