4

と に 2 つのデータベースがMySQLあり、 にテーブルを作成し、 のテーブルからすべての行をの新しいテーブルにコピーSQL Serverしたいと考えています。SQL ServerMySQLSQL 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();

しかし、あるテーブルから別のテーブルに行をコピーするのに問題があります。

選択クエリには Idatareader を使用していますが、行を別のテーブルに挿入する方法がわかりません。

4

7 に答える 7

2

あるテーブルから別のテーブルに行を挿入するには、以下のサンプル クエリを参照してください。

    INSERT INTO Store_Information (store_name, Sales, Date)
    SELECT store_name, sum(Sales), Date
     FROM Sales_Information
于 2012-09-16T10:23:48.813 に答える
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

列に必要な情報は、、、NameなどTypeですLength

次に、列を反復して挿入ステートメントを生成します

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] );
于 2012-09-16T10:45:57.843 に答える
0

しかし、あるテーブルから別のテーブルに行をコピーするのに問題があります。

を使用して、データベースに対してDataAdapter を使用してバッチ更新/挿入を実行し、SqlDataAdapter.UpdateBatchSizeあるテーブルから別のテーブルにデータをコピーできます。次のようなものを使用して、最初の 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 のこの主題に関する完全なチュートリアルから引用されています。詳細については、それを参照できます。

于 2012-09-16T09:30:57.273 に答える
-1

通常、それは sth です。SQL で直接行うことができますINSERT INTO table FROM SELECT * FROM othertable

于 2012-09-16T09:33:17.943 に答える
-1

すべてのレコードを新しいテーブルに挿入する場合 (2 つ目のテーブルが存在しない場合)

Old_Table_Name から New_Table_Name に * を選択します。

すべてのレコードを 2 番目のテーブルに挿入する場合 (2 番目のテーブルが存在する場合、テーブル構造は同じである必要があります)

Insert into Second_Table_Name from(Select * from First_Table_Name);

于 2013-09-04T10:00:19.930 に答える