多行插入 - > statement超出了允许的最大1000行值

时间:2009-05-04 17:55:40

标签: c# sql-server

我正在使用sql 2008 express edition,我正在尝试通过我的C#应用​​程序进行多行插入。

我有大约需要插入的100000条记录。

好的前1000条记录一切顺利,然后我收到了错误:

“INSERT语句中的行值表达式的数量超过了允许的最大1000行值。”

我查看了我的列数据类型 - > int,所以这不应该是问题。 我检查了我的代码,我插入了500条记录。

所以我用谷歌搜索它但找不到任何有用的东西。有人可以解释为什么我会得到这个错误,如果可能的话如何解决它。

3 个答案:

答案 0 :(得分:5)

您可以使用SQLBulkCopy课程。它支持批处理,事务并且比标准插入语句更有效。

答案 1 :(得分:0)

这是我的代码处理多插入

的方式
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。也许这是一个更好的解决方案。

答案 2 :(得分:0)

你可以把这一切都归结为:

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关键字。它使用TOPROW_NUMBER代替。