Вставка в несколько строк -> инструкция превышает максимально допустимое количество значений в строке 1000 - PullRequest
5 голосов
/ 04 мая 2009

Я использую SQL 2008 Express Edition и пытаюсь выполнить вставку нескольких строк через мое приложение C #.

У меня есть около 100000 записей, которые нужно вставить.

Хорошо, все хорошо для первых 1000 записей, затем я получаю сообщение об ошибке:

"Количество выражений значений строк в инструкции INSERT превышает максимально допустимое количество из 1000 значений строк."

Я посмотрел на тип данных моего столбца -> int, так что проблем не должно быть. Я проверил свой код и вставляю по 500 записей.

Так что я гуглил это, но не смог найти ничего полезного. Может кто-нибудь объяснить, почему я получаю эту ошибку и, если возможно, как ее решить.

Ответы [ 3 ]

5 голосов
/ 04 мая 2009

Вы можете использовать класс SQLBulkCopy . Который поддерживает пакетирование, транзакции и более эффективен, чем стандартные операторы вставки.

0 голосов
/ 04 мая 2009

Вы можете привести все это к следующему:

var sql = "SET IDENTITY_INSERT table_mssql ON;" 
        + "INSERT INTO table_mssql"
        +      "(id, traffic_id, dow, uu, imps, impsuu, otsw, otsm)"
        + " SELECT id, traffic_id, dow, uu, imps, impsuu, otsw, otsm "
        + " FROM table_mysql;"
        + "SET IDENTITY_INSERT table_mssql OFF;";

if (!InsertDB(sqlDB))
{
    Log.LogMessageToFile("Import.cs -> table_mssql: No insert happend!");
}

Также: вы должны знать, что Sql Server не поддерживает ключевое слово MySql LIMIT. Вместо него используется TOP или ROW_NUMBER.

0 голосов
/ 04 мая 2009

Вот как мой код обрабатывает мульти-вставку

var count = "SELECT COUNT(*) as rowcount FROM table_mysql GROUP BY id";

var countReader = Retrieve(count);
var countRows = 0;
try
{
    while (countReader.Read())
    {
        countRows += int.Parse(countReader.GetValue(0).ToString());
    }
}
catch (Exception ex)
{
    Log.LogMessageToFile("Import.cs -> table_mssql: " + ex.StackTrace + " /n" + ex.Message);
}
finally
{
    if (countReader != null) { countReader.Close(); _crud.close_conn(); }
}

for (var a = 0; a < countRows; )
{
    var sql = "SELECT id, traffic_id, dow, uu, imps, impsuu, otsw, otsm FROM table_mysql LIMIT " + a + ", " + (a + 500) + "";

    var reader = Retrieve(sql);
    try
    {
        var builder = new StringBuilder();
        builder.Append(
            "SET IDENTITY_INSERT table_mssql ON;INSERT INTO table_mssql(id, traffic_id, dow, uu, imps, impsuu, otsw, otsm) VALUES ");
        while (reader.Read())
        {
            Application.DoEvents();
            try
            {
                builder.Append("(" + reader.GetValue(0) + ", " + reader.GetValue(1) + ", " +
                               reader.GetValue(2) +
                               ", " + reader.GetValue(3) + ", " + reader.GetValue(4) +
                               ", " + reader.GetValue(5) + ", " + reader.GetValue(6) + ", " +
                               reader.GetValue(7) +
                               "), ");

            }
            catch (Exception ex)
            {
                Log.LogMessageToFile("Import.cs -> table_mssql: " + ex.StackTrace + " /n" + ex.Message);
            }
        }

        var sqlDB = builder.ToString(0, builder.Length - 2);

        sqlDB += ";SET IDENTITY_INSERT table_mssql OFF;";
        if (!InsertDB(sqlDB))
        {
            Log.LogMessageToFile("Import.cs -> table_mssql: No insert happend!");
        }
    }
    catch (Exception ex)
    {
        Log.LogMessageToFile("Import.cs -> table_mssql: " + ex.StackTrace + " /n" + ex.Message);
        return false;
    }
    finally
    {
        if (reader != null)
        {
            reader.Close();
            _crud.close_conn();
        }
    }
    a = a + 500;
}

Я собираюсь проверить sqlbulkcopy. Может быть, это лучшее решение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...