我有一个空表InsertTable
,其中包含Meta information
和Data 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),
...)
答案 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)