Sql Server 2008 Ajuste com grandes transações (700k + linhas / transação)

Então, estou trabalhando em um banco de dados que adicionarei aos meus projetos futuros como uma espécie de banco de dados de suporte, mas estou tendo um pouco de problema com ele, especialmente os logs.

O banco de dados basicamente precisa ser atualizado uma vez por mês. A tabela principal deve ser limpa e depois recarregada de um arquivo CSV. O problema é que o Sql Server gerará um log MEGA grande para ele. Consegui preenchê-lo uma vez, mas queria testar todo o processo limpando-o e depois recarregando-o.

É quando eu recebo um erro que o arquivo de log está cheio. Ele pula de 88 MB (após diminuir por meio do plano de manutenção) para 248 MB e, em seguida, interrompe o processo completamente e nunca é concluído.

Limitei o crescimento em 256 MB, aumentando em 16 MB, motivo pelo qual falhou, mas, na realidade, não preciso registrar nada. Existe uma maneira de ignorar completamente o log em qualquer consulta que esteja sendo executada no banco de dados?

Obrigado por todas as respostas com antecedência!

EDITAR: Pelas sugestões de @ mattmc3, eu implementei SqlBulkCopy para todo o procedimento. Funciona INCRÍVEL, exceto que meu loop está de alguma forma travando no último pedaço restante que precisa ser inserido. Não tenho muita certeza de onde estou errado, nem sei se esse é um loop adequado, por isso gostaria de receber ajuda.

Eu sei que é um problema com as últimas chamadas GetDataTable ou SetSqlBulkCopy. Estou tentando inserir 788189 linhas, 788000 entrar e os 189 restantes estão travando ...

string[] Rows;

using (StreamReader Reader = new StreamReader("C:/?.csv")) {
    Rows = Reader.ReadToEnd().TrimEnd().Split(new char[1] {
        '\n'
     }, StringSplitOptions.RemoveEmptyEntries);
};

int RowsInserted = 0;

using (SqlConnection Connection = new SqlConnection("")) {
    Connection.Open();

    DataTable Table = null;

    while ((RowsInserted < Rows.Length) && ((Rows.Length - RowsInserted) >= 1000)) {
        Table = GetDataTable(Rows.Skip(RowsInserted).Take(1000).ToArray());

        SetSqlBulkCopy(Table, Connection);

        RowsInserted += 1000;
    };

    Table = GetDataTable(Rows.Skip(RowsInserted).ToArray());

    SetSqlBulkCopy(Table, Connection);

    Connection.Close();
};

static DataTable GetDataTable(
    string[] Rows) {
    using (DataTable Table = new DataTable()) {
        Table.Columns.Add(new DataColumn("A"));
        Table.Columns.Add(new DataColumn("B"));
        Table.Columns.Add(new DataColumn("C"));
        Table.Columns.Add(new DataColumn("D"));

        for (short a = 0, b = (short)Rows.Length; a < b; a++) {
            string[] Columns = Rows[a].Split(new char[1] {
                ','
            }, StringSplitOptions.RemoveEmptyEntries);

            DataRow Row = Table.NewRow();

            Row["A"] = Columns[0];
            Row["B"] = Columns[1];
            Row["C"] = Columns[2];
            Row["D"] = Columns[3];

            Table.Rows.Add(Row);
        };

        return (Table);
    };
}

static void SetSqlBulkCopy(
    DataTable Table,
    SqlConnection Connection) {
    using (SqlBulkCopy SqlBulkCopy = new SqlBulkCopy(Connection)) {
        SqlBulkCopy.ColumnMappings.Add(new SqlBulkCopyColumnMapping("A", "A"));
        SqlBulkCopy.ColumnMappings.Add(new SqlBulkCopyColumnMapping("B", "B"));
        SqlBulkCopy.ColumnMappings.Add(new SqlBulkCopyColumnMapping("C", "C"));
        SqlBulkCopy.ColumnMappings.Add(new SqlBulkCopyColumnMapping("D", "D"));

        SqlBulkCopy.BatchSize = Table.Rows.Count;
        SqlBulkCopy.DestinationTableName = "E";
        SqlBulkCopy.WriteToServer(Table);
    };
}

EDITAR / CÓDIGO FINAL: Portanto, o aplicativo agora está concluído e funciona INCRÍVEL, e muito rápido! @ mattmc3, obrigado por toda a ajuda! Aqui está o código final para quem achar útil:

List<string> Rows = new List<string>();

using (StreamReader Reader = new StreamReader(@"?.csv")) {
    string Line = string.Empty;

    while (!String.IsNullOrWhiteSpace(Line = Reader.ReadLine())) {
        Rows.Add(Line);
    };
};

if (Rows.Count > 0) {
    int RowsInserted = 0;

    DataTable Table = new DataTable();

    Table.Columns.Add(new DataColumn("Id"));
    Table.Columns.Add(new DataColumn("A"));

    while ((RowsInserted < Rows.Count) && ((Rows.Count - RowsInserted) >= 1000)) {
        Table = GetDataTable(Rows.Skip(RowsInserted).Take(1000).ToList(), Table);

        PerformSqlBulkCopy(Table);

        RowsInserted += 1000;

        Table.Clear();
    };

    Table = GetDataTable(Rows.Skip(RowsInserted).ToList(), Table);

    PerformSqlBulkCopy(Table);
};

static DataTable GetDataTable(
    List<string> Rows,
    DataTable Table) {
    for (short a = 0, b = (short)Rows.Count; a < b; a++) {
        string[] Columns = Rows[a].Split(new char[1] {
            ','
        }, StringSplitOptions.RemoveEmptyEntries);

        DataRow Row = Table.NewRow();

        Row["A"] = "";

        Table.Rows.Add(Row);
    };

    return (Table);
}

static void PerformSqlBulkCopy(
    DataTable Table) {
    using (SqlBulkCopy SqlBulkCopy = new SqlBulkCopy(@"", SqlBulkCopyOptions.TableLock)) {
        SqlBulkCopy.BatchSize = Table.Rows.Count;
        SqlBulkCopy.DestinationTableName = "";
        SqlBulkCopy.WriteToServer(Table);
    };
}

questionAnswers(2)

yourAnswerToTheQuestion