我正在使用sql 2008 express edition,我正在尝试通过我的C#应用程序进行多行插入。
我有大约需要插入的100000条记录。
好的前1000条记录一切顺利,然后我收到了错误:
“INSERT语句中的行值表达式的数量超过了允许的最大1000行值。”
我查看了我的列数据类型 - > int,所以这不应该是问题。 我检查了我的代码,我插入了500条记录。
所以我用谷歌搜索它但找不到任何有用的东西。有人可以解释为什么我会得到这个错误,如果可能的话如何解决它。
答案 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
关键字。它使用TOP
或ROW_NUMBER
代替。