C#でテーブルコピーするなら SqlBulkCopy が速かった
テーブル構成や行数など、いろいろ条件はあると思いますが、万単位のデータをコピーするのであれば一度試してみてください。
var bc = new SqlBulkCopy(con);
bc.DestinationTableName = tableName;
bc.WriteToServer(dt);
con は接続オブジェクト、dt は DataTable*1です。
事前に DataTable に select しますが、列の並びがコピー先のテーブルに一致している必要がありますので注意してください。
タイムアウトしてしまう場合は、BulkCopyTimeout(ミリ秒)で設定できます。
bc.BulkCopyTimeout = 3000 * 1000;
*1:DataReaderも渡せるようです