将前x列从一个表复制到另一个空表

时间:2018-12-18 11:54:22

标签: sql-server tsql

我有一个空表InsertTable,其中包含Meta informationData information(共60列)。我知道元信息被写入前20列,并希望将它们复制到具有(以及数据列)特定列名的表MetaInfo中,并将其他40列复制到表DataInfo中。 InsertTable中的列没有特定的名称,仅V1-V60。现在,我正在寻找一种执行方法:将前x列复制到表y的前x列中。就像您在Excel中一样:选择前20列以打开另一个工作簿,因为第一列是ID,所以将20列插入B1。

我发现此代码可以复制列

INSERT INTO metaTable (Name)
SELECT v1 FROM InsertTable

我可以为每行创建(通过C#中的循环)select语句并将其组合在一起,但是由于列名不是连续的但具有其特定名称,因此创建Insert Into Statement时遇到了问题。

有人可以在这里帮助我吗?

这是表格的样子:

CREATE TABLE [MetaInfo]
(ID int identity(1,1) not null primary key,
Name varchar(max),
Address varchar(max),
...)

CREATE TABLE [InsertTable]
(v1 varchar(max),
v2 varchar(max),
...)

2 个答案:

答案 0 :(得分:0)

您是否正在寻找这种东西,

fs.readFileSync

上面的查询是针对mysql的,但也可以针对MSSQL编写的

答案 1 :(得分:0)

您可以动态构建SQL:

declare 
    @sourceTable varchar(50) = 'InsertTable'
    ,@targetTable varchar(50) = 'metaTable'
    ,@sourceColumns varchar(4000) = ''
    ,@targetColumns varchar(4000) = ''
    ,@sql varchar(max)


Select 
    @sourceColumns += iif(table_name <> @sourceTable, '', iif(len(@sourceColumns) = 0, '', ', ')  + quotename([COLUMN_NAME], '[]'))
    ,@targetColumns += iif(table_name <> @targetTable, '', iif(len(@targetColumns) = 0, '', ', ')  + quotename([COLUMN_NAME], '[]'))

from (
    select 
        object_name(object_id) as table_name
        ,name as column_name
    FROM sys.columns 
    where object_name(object_id) in (@sourceTable, @targetTable)
    AND COLUMNPROPERTY(object_id, name, 'ordinal') <= 20  -- only get the first 20 columns
    and is_identity = 0     -- exclude identity columns
) cols



select 
    @sql = concat('INSERT INTO ', @targetTable, ' (', @targetColumns, ')', char(10), 
                    'SELECT ', @sourceColumns, ' FROM ', @sourceTable)

print @sql
exec (@sql)