首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >多行插入->语句超过了允许的最大行数1000行值

问多行插入->语句超过了允许的最大行数1000行值
EN

Stack Overflow用户
提问于 2009-05-04 17:55:40
回答 3查看 13.8K关注 0票数 5

我正在使用SQL2008快速版,并且我正尝试通过我的C#应用程序进行多行插入。

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

好的,前1000条记录一切正常,然后我得到了错误:

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

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

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2009-05-04 18:20:51

您可以使用SQLBulkCopy类。它支持批处理、事务,并且比标准insert语句更有效。

票数 5
EN

Stack Overflow用户

发布于 2009-05-04 18:29:44

这就是我的代码处理多个插入的方式

代码语言:javascript
复制
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。也许这是一个更好的解决方案。

票数 0
EN

Stack Overflow用户

发布于 2009-05-04 18:35:50

你可以把整个事情归结为:

代码语言:javascript
复制
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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/821185

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档