求高效批量插入sql语句写法。
需求说明:
用户表:Web_User,用户模版表:Web_UserTemplate,用户名模版明细表:Web_UserTempInfo
表结构:
Web_User {ID int,Name nvarchar(100),……}
Web_UserTemplate {ID int,UserID int,Tid int,……} 注:UserID 关联Web_User表ID字段
Web_UserTempInfo {ID int,UTempID int,……} 注:UserID 关联Web_UserTemplate表UTempID字段
业务逻辑:
DataTable table= ExcelHelper.ImportDataTableFromExcel(path, 0, 2);//导入EXCEL返回DataTable
for (int j = 0; j < table.Row.Count; j++)//所有用户信息
{
DataTable usertable = DatabaseProvider.GetInstance().GetUserSearch(user.Name, user.Sex.ToString(), user.BirthDay, "", "", "", "", "");//
if (usertable.Rows.Count > 0) //用户已经存在
{
uid = usertable.Rows[0]["ID"].ToString();//返回用户ID
}
else
{
DataTable usertableinfo = DatabaseProvider.GetInstance().InsertUserInfo(user);//添加用户
if (usertableinfo.Rows.Count > 0)
{
uid = usertableinfo.Rows[0]["ID"].ToString();
}
}
DataTable tableUserTemp = DatabaseProvider.GetInstance().GetUserTemplateSearch(uid, tid);//是否已存在模版
if (tableUserTemp.Rows.Count > 0)
{
utid = tableUserTemp.Rows[0]["ID"].ToString();//返回模版ID
}
else
{
DataTable table3 = DatabaseProvider.GetInstance().InsertUserTemplate(info);//添加新的模版
if (table3.Rows.Count > 0)
{
utid = table3.Rows[0]["ID"].ToString();返回模版ID
}
}
for (int j = 0; j < table.Columns.Count; j++)
{
DataTable tableinfo = DatabaseProvider.GetInstance().GetUserTemplateDValue(Convert.ToInt32(utid).ToString(), tid, Convert.ToInt32(table.Columns[j].ColumnName), fdate, "");
if (tableinfo.Rows.Count > 0)
{
dtSql.Add("UPDATE Web_UserTempInfo SET DValue='" + table.Rows[i][j].ToString().Replace("'","\"") + "' WHERE ID=" + tableinfo.Rows[0]["ID"].ToString() + " ");
editCount++;
}
else
{
dtSql.Add("INSERT INTO Web_UserTempInfo(UTID,DID,DValue,FollowDate,Followhours,AddDate) VALUES(" + Convert.ToInt32(utid) + "," + table.Columns[j].ColumnName + ",'" + table.Rows[i][j].ToString().Replace("'", "\"") + "','" + fdate + "','','" + DateTime.Now.ToString() + "') ");
addCount++;
}
}
}
DbHelper.ExcuteTransactionSql(dtSql);
返回的excel的DataTable列数,有200列,行数10000行,
导致数据量达到几百万条,而且上面,查询和添加,多次连接数据库,效率地下。导入100万条就要消耗大量的时间。
在这里请教各位,教个能显著提高效率的设计方法。
分没了,无法加分。
有非常好的方法的,需要占用您大量时间的,请联系QQ:371124977,注明:SQL效率,有报酬,酬谢。
请各位多多指导。
[解决办法]
试试这种写法
INSERT INTO “TABLE”SELECT 1, 'TEXT1' UNION SELECT 2, 'TEXT2' UNION SELECT 3, 'TEXT3'
还有这种
DECLARE @x xml
SET @x='<ids>
<im id="1" c="TEXT1"/>
<im id="2" c="TEXT2"/>
<im id="3" c="TEXT3"/>
</ids>'
SELECT T1.ids.value('@id','int') as id ,T1.ids.value('@c','int') as click FROM @x.nodes('/ids/im') T1(ids)
对你的应用环境不是很清楚,你可以看看bulkcopy
http://msdn.microsoft.com/en-us/library/7ek5da1a.aspx
[解决办法]
飘过、
<input type="image" name="imageField" src="images/xys_pao.png" onclick="form1.submit();MM_controlShockwave('0','','Play')" width="48" height="52" >
在onclick里面都submit了,后面的controlShockwave已经不会执行了,改用ajax提交吧
[解决办法]
都不用事务的,死的惨
[解决办法]
推荐!
[解决办法]
你这种情况必须用ajax做进度条,时间长点没关系,甚至可以一条一条的提交都行。我喜欢用sqlcommand来配合进度条来完成这种事情,在单次使用的时候,sqlcommand效率比较高。dataTable主要是内存表,在需要后续查询的时候才体现出优势。
[解决办法]
如果是SqlServer , 可以用 表变量 和 MERGEINTO 相结合的方法
[解决办法]
看下有没有办法用这个代替
http://www.cnblogs.com/djian/archive/2010/11/10/1873850.html
[解决办法]
如果是sqlserver数据库用bulkcopy试一下
如果是oracle数据库用户存储过程加(用数组向存储过程中添加数据),这样是不用insert语句的
[解决办法]
oracle有一个专门插入批量数据库的方法
[解决办法]
个人表示同求! 经常性的要添加很多的东西!!!
[解决办法]
oracle有一个专门插入批量数据库的方法
[解决办法]
这种情况下是绝对不能用c#编程逐条导入的,需要数据库的导入函数才行。
[解决办法]
唉,搞不定啊,晕