我知道有人问here。但它并没有回答我的问题。我在数据库中有10个表,名为" merged"。我正在使用一堆具有相同结构的其他数据库"合并"除了"合并"有一个额外的列,它是表中两列的组合。我试图将所有这些数据转移到合并但我相信我认为额外的列阻止了转移。
SqlCommand MergeDB = connDestination.CreateCommand();
string sqlMergeDB = "";
int a= 0;
for (a=0; a < tablenames.Length; a++){
string sqlMergeDB = "INSERT INTO sql_merged.dbo." + tablenames[a] + " SELECT * FROM sourceForMerged.dbo." + tablenames[a];
using (SqlDataReader reader = MergeDB.ExecuteReader()) {
while(reader.Read())
{
MessageBox.Show("Transfered a table");
}
}
}
错误发生在上面代码的SqlDataReader行,我相信这意味着sql命令有问题。请帮忙。感谢
答案 0 :(得分:5)
如果您命名INSERT的两个部分中的所有列。 。 。 SELECT语句可以映射哪个源列插入到哪个目标列中。
如果您想象TargetTable (Name, ProductType, Date)
和SourceTable (Date, Type, Name)
,请使用:
INSERT INTO TargetTable (Name, ProductType, Date)
SELECT Name, Type, Date FROM SourceTable
即使订单不匹配,也会将三列移动到相应的列中。
如果您在一个表或另一个表中有“额外”列,您可以将它们保留或提供表达式来填充它们:
INSERT INTO TargetTable (Name, ProductType, Date, CombinedValues)
SELECT Name, Type, Date, (ValCol1 + ' ' + ValCol2) FROM SourceTable
有四列从四个表达式接收数据,其中一个表连接两列有价值的数据。 (在现实生活中,你可能会发现连接表达式更复杂,但这是基本的想法。)
答案 1 :(得分:2)
你不能使用:
Insert Into [Table] Select * From [Table2]
除非表模式相同。您必须列出插入语句的列。
如果可能,您可以删除目标表上的列,然后在插入后将其添加回来。
如果表格很宽,你可以做这样的事情来建立你插入代码:
SELECT
'cmd.Parameter.Add("@' + column_name + '", SqlDbType.' + data_type + ');',
column_name 'Column Name',
data_type 'Data Type'
FROM information_schema.columns
WHERE table_name = 'TableName'