将表的所有行复制到另一个表

时间:2012-09-16 09:00:26

标签: c# mysql sql sql-server

我在MySQLSQL Server中有两个数据库,我想在SQL Server中创建表,并将MySQL中表格中的所有行复制到新表中SQL Server

我可以在SQL Server中创建与MySQL相同的表格,代码如下:

List<String> TableNames = new List<string>();
{ 
    IDataReader reader= 
        ExecuteReader("SELECT Table_Name FROM information_schema.tables WHERE table_name LIKE 'mavara%'",MySql);
    while (reader.Read()) {
        TableNames.Add(reader[0].ToString());
    }
    reader.Close();
}

foreach (string TableName in TableNames) {
    IDataReader reader = 
        ExecuteReader("SELECT Column_Name,IS_NULLABLE,DATA_TYPE FROM information_schema.columns where TABLE_Name='" + TableName + "'",MySql);
    List<string[]> Columns = new List<string[]>();
    while (reader.Read()) { 
        string[] column = new string[3];
        column[0] = reader[0].ToString();
        column[1] = reader[1].ToString();
        column[2] = reader[2].ToString();
        Columns.Add(column);
    }

    reader.Close();

    // create table
    string  queryCreatTables=  "CREATE TABLE [dbo].[" + TableName + "](\n";
    foreach(string[] cols in Columns)
    {
        queryCreatTables +="["+ cols[0] + "] " + cols[2] + " ";
        if (cols[1] == "NO")
            queryCreatTables += "NOT NULL";
        // else
        //   queryCreatTables += "NULL";
        queryCreatTables += " ,\n ";
    }
    queryCreatTables += ")";

    System.Data.SqlClient.SqlCommand smd = 
        new System.Data.SqlClient.SqlCommand(queryCreatTables, MsSql);
    System.Data.SqlClient.SqlDataReader sreader = smd.ExecuteReader();
    sreader.Close();

但是我有问题将行从一个表复制到另一个表中。

对于select查询,我使用Idatareader,但我不知道如何将行插入另一个表。

7 个答案:

答案 0 :(得分:2)

要将一个表中的行插入另一个表,请参阅以下示例查询

    INSERT INTO Store_Information (store_name, Sales, Date)
    SELECT store_name, sum(Sales), Date
     FROM Sales_Information

答案 1 :(得分:1)

算法如下:

1. For each table in source database
2.    Get a list of columns for that table
3.    Create table in destination database
4.    SELECT * FROM the table in source
5.    For each row in data
6.       Generate INSERT statement and execute on destination database

列所需的信息为NameTypeLength等。

然后通过迭代列

生成insert语句
var insertStatement = "INSERT INTO " + tableName + " VALUES( ";
foreach( var column in columns )
    insertStatement += "@" + column.Name + ",";
insertStatement[insertStatement.Length-1] = ')';

var command = new SqlCommand( insertStatement, MsSql );

// iterate over the columns again, but this time set values to the parameters
foreach( var column in columns )
   command.Parameters.AddWithValue( "@"+column.Name, currentRow[column.Name] );

答案 2 :(得分:0)

  

但是我有一个问题就是将行从一个表复制到另一个表中。

您可以对数据库使用SqlDataAdapter.UpdateBatchSizeperform Batch Updates/Inserts with a DataAdapter将数据从一个表复制到另一个表。从第一个MYSQL表中获取所有记录后,使用类似:

//Get the rows from the first mysql table as you did in your question
DataTable mysqlfirstTableRowsTobeCopied = GetDataTableFromMySQLTable();

然后你必须创建一个推荐文本来执行INSERT之类的事情:

cmd.CommandText = "INSERT INTO TableName Column_Name, ... VALUES(...)";

或者您可以使用存储过程:

CREATE PROCEDURE sp_BatchInsert ( @ColumnName VARCHAR(20), ... ) 
AS 
BEGIN 
            INSERT INTO TableName VALUES ( @ColumnNamne, ...); 
END

然后:

DataTable mysqlfirstTableRowsTobeCopied = GetDataTableFromMySQLTable();

SqlConnection conn = new SqlConnection("Your connection String");
SqlCommand cmd = new SqlCommand("sp_BatchInsert", conn);
cmd.CommandType = CommandType.StoredProcedure;
cmd.UpdatedRowSource = UpdateRowSource.None;

// Set the Parameter with appropriate Source Column Name
cmd.Parameters.Add("@ColumnName", SqlDbType.Varchar, 50,
    mysqlfirstTableRowsTobeCopied.Columns[0].ColumnName);   
...
SqlDataAdapter adpt = new SqlDataAdapter();
adpt.InsertCommand = cmd;
// Specify the number of records to be Inserted/Updated in one go. Default is 1.
adpt.UpdateBatchSize = 20;

conn.Open();
int recordsInserted = adpt.Update(mysqlfirstTableRowsTobeCopied);   
conn.Close();

此代码实际上是从codeproject中有关此主题的完整教程中引用的,您可以参考它来获取更多信息:

答案 3 :(得分:0)

通常那是......您可以直接在SQL中执行:INSERT INTO table FROM SELECT * FROM othertable;

答案 4 :(得分:0)

假设您已经有一个要与其他表合并的行的数据表...

再次有两种方法可以执行此操作……假设您已经选择了数据并将其放入新表中。

            oldTable.Load(newTable.CreateDataReader());

            oldTable.Merge(newTable);

答案 5 :(得分:-1)

将所有记录插入新表(如果第二个表不存在)

从Old_Table_Name中选择* into New_Table_Name;

将所有记录插入第二个表(如果存在第二个表但表结构应该相同)

从(Select * from First_Table_Name)插入Second_Table_Name;

答案 6 :(得分:-1)

以防万一它可以帮助某人,我已经找到了使用SqlDataAdapter在C#中执行此操作的简便方法。它会自动检测表的结构,因此您不必枚举所有列或担心表结构发生变化。然后将数据批量插入目标表中。

只要两个表具有相同的结构,这将起作用。 (例如,从生产表复制到开发人员空表。)

>>> func(arr)
array([[1, 2, 3],
       [3, 4, 3],
       [5, 6, 2],
       [7, 8, 1],
       [9, 0, 4]])