大侠们好,
    现在项目中遇到这么一个问题:项目需要把原Maximo系统(PS:IBM的设备管理系统)中的部分数据抓过来,比如:工单、资
产、备件等表中的相关字段信息,Maximo原系统中的源表很多、源表中的字段很复杂,现项目并不需要所有的源表信息,所以
需要从Maximo系统库的表中抽取相关表的相关字段出来,把这些字段组合成一条数据
    
     涉及到的数据处理情况比如:a、单张工单的维修人员是多个维修人员,此时多个人员姓名需要合并为一个字符串
                               b、工单描述、备注等字段中的特殊字符需要处理,比如“)'”同时出现,可能影响插   入SQL语句的执行
                               c、多表关联查询
                               d、以及其他各种处理情况,这里就不一一列举了提示:需要处理的Maximo源表的数据量都非常巨大,1千万+++++,Oracle10g数据库
目前的处理方法:
     现在是写了一个winform程序来进行处理,就是每次读取主表的200条数据,然后遍历主表数据行,根据主表行的关键字段分布到各个表中再去查询相关需要的字段信息,这样拼出一条数据InsertSql寄存在一个ArryList中,200行主表数据遍历完成之后再执行带数据库事务的批量插入操作,当段数据插入之后,标识字段+200再进行下一路的主表数据读取及插入,以此循环
现在遇到的问题是:1、每200条主表数据的轮询过程,几分钟不等,速度太慢了,处理完几千万数据不知要多久
                  2、程序执行好几个小时后会发生未知错误,不是数据查询、插入等的错误

     希望能够给予帮助的大侠们看到帖子能及时给予回复,不胜感激。一段简单的数据处理日志记录:
1 2011-10-29 18:59:09 **********WorkOrderID当前已执行位置:startID=106201;    endID=106401**********
2 2011-10-29 18:59:09 **********工单资产信息行数:63**********
3 2011-10-29 18:59:09 **********成功执行Insert Sql语句条数:121行**********
4 2011-10-29 18:57:13 **********工单资产信息行数:64**********
5 2011-10-29 18:57:13 **********成功执行Insert Sql语句条数:0行**********
6 2011-10-29 18:57:13 **********工单资产信息行数:0**********
7 2011-10-29 18:57:13 **********WorkOrderID当前已执行位置:startID=106001;    endID=106201**********
8 2011-10-29 18:57:12 **********成功执行Insert Sql语句条数:6行**********
9 2011-10-29 18:57:12 **********WorkOrderID当前已执行位置:startID=105801;    endID=106001**********
10 2011-10-29 18:57:04 **********WorkOrderID当前已执行位置:startID=105601;    endID=105801**********
11 2011-10-29 18:57:04 **********工单资产信息行数:5**********
12 2011-10-29 18:57:04 **********成功执行Insert Sql语句条数:64行**********
13 2011-10-29 18:55:56 **********WorkOrderID当前已执行位置:startID=105401;    endID=105601**********
14 2011-10-29 18:55:56 **********成功执行Insert Sql语句条数:3行**********
15 2011-10-29 18:55:56 **********工单资产信息行数:38**********
16 2011-10-29 18:55:53 **********成功执行Insert Sql语句条数:143行**********
17 2011-10-29 18:55:53 **********工单资产信息行数:2**********
18 2011-10-29 18:55:53 **********WorkOrderID当前已执行位置:startID=105201;    endID=105401**********
19 2011-10-29 18:53:48 **********成功执行Insert Sql语句条数:115行**********
20 2011-10-29 18:53:48 **********工单资产信息行数:70**********
21 2011-10-29 18:53:48 **********WorkOrderID当前已执行位置:startID=105001;    endID=105201**********C#数据处理的主要方法贴上,请大侠指教,谢谢了:
public void RunDataPanel()
        {
            da.SaveLogs("WorkOrderID当前已执行位置:startID=" + startID + ";    endID=" + endID);            string strSql = string.Empty;            strSql = "select distinct a.assetnum 资产编号,a.description 设备名称,w.wonum 工单号,w.description 工单描述,w.worktype 工单类型,w.FAILDATE 日期,w.SiteID,w.WO20 ";
            strSql += "from workorder w,asset a ";
            strSql += "where w.worktype not in ('MR','MQ') and a.siteid = w.siteid and a.assetnum = w.assetnum ";
            strSql += "and workorderid>=" + startID + " and workorderid<" + endID + "";            //资产工单信息
            DataTable dt = da.RunSelectSQL(strSql);
            da.SaveLogs("工单资产信息行数:" + dt.Rows.Count);            //插入SQL语句集合
            ArrayList sqlArr = new ArrayList();
            //维修记录ID
            int CMID = da.GetMaxID("ID", "ENQ_DEVICESERVICE");
            //维修更换配件ID
            int WXPJID = da.GetMaxID("ID", "ENQ_SERVICEPARTS");
            //维修步骤ID
            int BZID = da.GetMaxID("ID", "ENQ_SERVICEBZ");            //维保记录ID
            int PMID = da.GetMaxID("ID", "ENQ_DEVICEPROTECTED");
            //维保更换配件ID
            int WBPJID = da.GetMaxID("ID", "ENQ_PROTECTEDPARTS");
            //维保内容ID
            int NRID = da.GetMaxID("ID", "ENQ_PROTECTEDNR");            foreach (DataRow dr in dt.Rows)
            {
                #region 基本信息收集
                //资产编号
                string assetNum = dr["资产编号"].ToString();
                //工单号
                string woNum = dr["工单号"].ToString();                //故障原因附加
                strSql = "select distinct f.CUSTDESCCN 故障现象, f1.CUSTDESCCN 原因分析 ";
                strSql += "from workorder w, failurecode f0, extwo01 e, CUSTFAILUREREPORT c, failurecode f, CUSTFAILUREREPORT c2, failurecode f1 ";
                strSql += "where w.status in (select value from synonymdomain where domainid = 'WOSTATUS' and maxvalue in ('APPR','COMP','CLOSE')) ";
                strSql += "and w.orgid = f0.orgid(+) and w.failurecode = f0.failurecode(+) and w.siteid = e.siteid(+) ";
                strSql += "and w.wonum = e.wonum(+) and w.siteid = c.siteid(+) and w.wonum = c.wonum(+) and c.parent(+) is null ";
                strSql += "and c.orgid = f.orgid(+) and c.failurecode = f.failurecode(+) and c.siteid = c2.siteid(+) and c.wonum = c2.wonum(+) ";
                strSql += "and c.custfailurereporid = c2.parent(+) and c2.orgid = f1.orgid(+) and c2.failurecode = f1.failurecode(+) ";
                strSql += "and w.wonum='" + woNum + "' ";
                DataTable temp1 = da.RunSelectSQL(strSql);
                //故障现象
                string strGZXX = string.Empty;
                //原因分析
                string strYYFX = string.Empty;
                if (temp1 != null)
                {
                    foreach (DataRow dr1 in temp1.Rows)
                    {
                        strGZXX += dr1["故障现象"] + ",";
                        strYYFX += dr1["原因分析"] + ",";
                    }
                }
                if (strGZXX.Length > 1)
                {
                    strGZXX = strGZXX.Substring(0, strGZXX.Length - 1);
                }
                if (strYYFX.Length > 1)
                {
                    strYYFX = strYYFX.Substring(0, strYYFX.Length - 1);
                }
                                //使用工具附加
                strSql = "select distinct c.description 使用工具 from tooltrans t,tool c where t.orgid = c.orgid and t.itemnum = c.toolnum ";
                strSql += "and t.refwo = '" + woNum + "' ";
                DataTable temp2 = da.RunSelectSQL(strSql);
                //使用工具
                string strSYGJ = string.Empty;
                if (temp2 != null)
                {
                    foreach (DataRow dr2 in temp2.Rows)
                    {
                        strSYGJ += dr2["使用工具"] + ",";
                    }
                }
                if (strSYGJ.Length > 1)
                {
                    strSYGJ = strSYGJ.Substring(0, strSYGJ.Length - 1);
                }                //维修人员附加
                strSql = "select p.displayname 维修人员 from labtrans t,craft c,labor l,person p ";
                strSql += "where t.orgid = c.orgid(+) and t.craft = c.craft(+) ";
                strSql += "and t.laborcode = l.laborcode(+) and t.orgid = l.orgid(+) and l.personid = p.personid(+) ";
                strSql += "and t.refwo = '" + woNum + "' ";
                DataTable temp3 = da.RunSelectSQL(strSql);
                //维修人员
                string strWXRY = string.Empty;
                if (temp3 != null)
                {
                    foreach (DataRow dr3 in temp3.Rows)
                    {
                        strWXRY += dr3["维修人员"] + ",";
                    }
                }
                if (strWXRY.Length > 1)
                {
                    strWXRY = strWXRY.Substring(0, strWXRY.Length - 1);
                }
                //维修耗时
                strSql = "select trunc(((t.actfinish - t.actstart)*24),2) 维修耗时 from workorder t ";
                strSql += "where t.wonum = '" + woNum + "' ";
                DataTable temp4 = da.RunSelectSQL(strSql);
                //维修耗时
                string strWXHS = string.Empty;
                if (temp4 != null)
                {
                    foreach (DataRow dr4 in temp4.Rows)
                    {
                        strWXHS = dr4["维修耗时"].ToString();
                    }
                }
                //保养周期
                strSql = "select  p.pmnum 预防性维护编码,p.FREQUENCY 维护频率,p.FREQUNIT 频率单位,p.description 预防性维护描述 ";
                strSql += "from asset t,pm p ";
                strSql += "where t.siteid = p.siteid and t.assetnum = p.assetnum and p.status = 'ACTIVE' ";
                strSql += "and t.assetnum = '"+assetNum+"' ";
                DataTable temp11 = da.RunSelectSQL(strSql);
                //保养周期
                string strBYZQ = string.Empty;
                //维保名称
                string strWBMC = string.Empty;
                //维保名称
                if (temp11 != null)
                {
                    foreach (DataRow dr11 in temp11.Rows)
                    {
                        strBYZQ = dr11["维护频率"].ToString() + dr11["频率单位"].ToString();
                        strWBMC = dr11["预防性维护描述"].ToString();
                    }
                }                //da.SaveLogs("资产编号:" + assetNum + "    工单号:" + woNum + "    故障现象:" + strGZXX + "   原因分析:" + strYYFX + "   使用工具:" + strSYGJ + "   维修人员:" + strWXRY + "   维修耗时:" + strWXHS + "   保养周期:" + strBYZQ);                #endregion                //工单所属区域
                string SiteID = dr["SiteID"].ToString();
                //WO20
                string WO20=dr["WO20"].ToString();
                //设备名称
                string SBName = dr["设备名称"].ToString();
                //日期
                string RiQi = dr["日期"].ToString();
                //工单描述
                string Re = dr["工单描述"].ToString();
         

解决方案 »

  1.   

    接上处理代码:
    /**********************************数据插入*********************************/
                    //工单类型
                    string type = dr["工单类型"].ToString();                string insertSql = string.Empty;                //维保工单
                    if (type.ToUpper().Equals("PM"))
                    {
                        #region 维保工单插入
                        PMID++;                    insertSql = "insert into ENQ_DEVICEPROTECTED(ID,WBBH,ZCNO,WBMC,SBName,WBDATE,GDH,GLGDH,WBZQ,REMARK,WBHZK,SYGJ,WBRY,WBHS,DBZC,ZCDATE,DBJD,JDDATE) ";
                        insertSql += "values(" + PMID + ",'" + this.ToSBC(woNum) + "','" + this.ToSBC(assetNum) + "','" + this.ToSBC(strWBMC) + "','" + this.ToSBC(SBName) + "','" + this.ToSBC(RiQi) + "','" + this.ToSBC(woNum) + "','','" + this.ToSBC(strBYZQ) + "',";
                        insertSql += "'" + this.ToSBC(Re) + "','','" + this.ToSBC(strSYGJ) + "','" + this.ToSBC(strWXRY) + "','" + this.ToSBC(strWXHS) + "','','','','')";                    sqlArr.Add(insertSql);                    /************************************保养内容************************************/
                        strSql = "select t.taskid,t.description from WOACTIVITY t where t.parent = '" + woNum + "' ";
                        DataTable temp5 = da.RunSelectSQL(strSql);
                        foreach (DataRow dr5 in temp5.Rows)
                        {
                            NRID++;                        string taskid = dr5["taskid"].ToString();
                            string description = dr5["description"].ToString();                        insertSql = "insert into ENQ_PROTECTEDNR(ID,WBBH,BYXH,CONTENT) values(" + NRID + ",'" + this.ToSBC(woNum) + "','" + this.ToSBC(taskid) + "','" + this.ToSBC(description) + "')";                        sqlArr.Add(insertSql);                    }                    /************************************保养使用配件************************************/
                        //实物料发放
                        strSql = "select w.wonum 工单号,w.description 工单描述,w.worktype 工单类型, ";
                        strSql += "m.ACTIVEMATNUM 实物料,am.description 实物料描述,m.QUANTITY 发放数量 ";
                        strSql += "from workorder w,(select s.siteid, s.ACTIVEMATNUM, s.refwo, ";
                        strSql += "sum(decode(s.issuetype,'ISSUE', abs(s.QUANTITY), 'RETURN', -abs(s.QUANTITY))) QUANTITY from activematusetrans s ";
                        strSql += "group by s.siteid, s.ACTIVEMATNUM, s.refwo) m,ACTIVEMAT am ";
                        strSql += "where w.istask <> 1 and w.status <> 'CAN' and w.siteid = m.siteid and w.wonum = m.refwo ";
                        strSql += "and m.QUANTITY <> 0 and m.ACTIVEMATNUM = am.activematnum(+) ";
                        strSql += "and w.wonum='" + woNum + "' ";
                        DataTable temp6 = da.RunSelectSQL(strSql);
                        foreach (DataRow dr6 in temp6.Rows)
                        {
                            WBPJID++;                        string ACTIVEMATNUM = dr6["实物料"].ToString();
                            string description = dr6["实物料描述"].ToString();
                            string QUANTITY = dr6["发放数量"].ToString();                        insertSql = "insert into ENQ_PROTECTEDPARTS(ID,WBBH,KCBM,MS,SL,YL) ";
                            insertSql += "values (" + WBPJID + ",'" + this.ToSBC(woNum) + "','" + this.ToSBC(ACTIVEMATNUM) + "','" + this.ToSBC(description) + "','" + this.ToSBC(QUANTITY) + "','')";                        sqlArr.Add(insertSql);
                        }                    //库存项目发放
                        strSql = "select w.wonum 工单号,w.description 工单描述,w.worktype 工单类型,m.itemnum 库存项目编码,";
                        strSql += "i.description 库存项目描述,m.QUANTITY 发放数量 ";
                        strSql += "from workorder w,(select s.siteid, s.itemnum, s.refwo, s.itemsetid, ";
                        strSql += "sum(decode(s.issuetype,'ISSUE', abs(s.QUANTITY), 'RETURN', -abs(s.QUANTITY))) QUANTITY from matusetrans s ";
                        strSql += "where s.issuetype in ('ISSUE','RETURN') group by s.siteid, s.itemnum, s.refwo, s.itemsetid) m,item i ";
                        strSql += "where w.istask <> 1 and w.status <> 'CAN' and w.siteid = m.siteid and w.wonum = m.refwo ";
                        strSql += "and m.QUANTITY <> 0 and m.itemnum = i.itemnum(+) and m.itemsetid = i.itemsetid(+) ";
                        strSql += "and w.wonum='" + woNum + "'";
                        DataTable temp7 = da.RunSelectSQL(strSql);
                        foreach(DataRow dr7 in temp7.Rows)
                        {
                            WBPJID++;                        string itemnum = dr7["库存项目编码"].ToString();
                            string description = dr7["库存项目描述"].ToString();
                            string QUANTITY = dr7["发放数量"].ToString();                        insertSql = "insert into ENQ_PROTECTEDPARTS(ID,WBBH,KCBM,MS,SL,YL) ";
                            insertSql += "values (" + WBPJID + ",'" + this.ToSBC(woNum) + "','" + this.ToSBC(itemnum) + "','" + this.ToSBC(description) + "','" + this.ToSBC(QUANTITY) + "','')";                        sqlArr.Add(insertSql);
                        }                    #endregion
                    
      

  2.   


    }//维修工单
                    else
                    {
                        #region 维修工单插入
                        //维修形式
                        string wxxs = string.Empty;
                        //外委工单
                        if (type.ToUpper().Equals("LM") || type.ToUpper().Equals("SM") || type.ToUpper().Equals("OM"))
                        {
                            wxxs = "外委";
                        }
                        else//自修工单
                        {
                            wxxs = "自修";
                        }
                        //崖城外委工单特殊判断
                        if (SiteID.ToUpper().Equals("CNOOCYC") && WO20.Equals(1))
                        {
                            wxxs = "外委";
                        }                    CMID++;                    insertSql = "insert into ENQ_DEVICESERVICE(ID,WXBH,ZCNO,WXXS,SBName,WXDATE,GDH,GLGDH,GZXX,YYFX,REMARK,WXHZK,SYGJ,WXRY,WXHS,ZCQZ,ZCDATE,JDQZ,JDDATE) ";
                        insertSql += "values(" + CMID + ",'" + this.ToSBC(woNum) + "','" + this.ToSBC(assetNum) + "','" + this.ToSBC(wxxs) + "','" + this.ToSBC(SBName) + "','" + this.ToSBC(RiQi) + "','" + this.ToSBC(woNum) + "',";
                        insertSql += "'','" + this.ToSBC(strGZXX) + "','" + this.ToSBC(strYYFX) + "','" + this.ToSBC(Re) + "','','" + this.ToSBC(strSYGJ) + "','" + this.ToSBC(strWXRY) + "','" + this.ToSBC(strWXHS) + "',";
                        insertSql += "'','','','')";                    sqlArr.Add(insertSql);                    /************************************维修步骤************************************/
                        strSql = "select t.taskid,t.description from WOACTIVITY t where t.parent = '" + woNum + "' ";
                        DataTable temp8 = da.RunSelectSQL(strSql);
                        foreach (DataRow dr8 in temp8.Rows)
                        {
                            BZID++;                        string taskid = dr8["taskid"].ToString();
                            string description = dr8["description"].ToString();                        insertSql = "insert into ENQ_SERVICEBZ(ID,WXBH,BZXH,CONTENT) values(" + BZID + ",'" + this.ToSBC(woNum) + "','" + this.ToSBC(taskid) + "','" + this.ToSBC(description) + "')";                        sqlArr.Add(insertSql);                    }                    /************************************维修更换配件************************************/
                        //实物料发放
                        strSql = "select w.wonum 工单号,w.description 工单描述,w.worktype 工单类型, ";
                        strSql += "m.ACTIVEMATNUM 实物料,am.description 实物料描述,m.QUANTITY 发放数量 ";
                        strSql += "from workorder w,(select s.siteid, s.ACTIVEMATNUM, s.refwo, ";
                        strSql += "sum(decode(s.issuetype,'ISSUE', abs(s.QUANTITY), 'RETURN', -abs(s.QUANTITY))) QUANTITY from activematusetrans s ";
                        strSql += "group by s.siteid, s.ACTIVEMATNUM, s.refwo) m,ACTIVEMAT am ";
                        strSql += "where w.istask <> 1 and w.status <> 'CAN' and w.siteid = m.siteid and w.wonum = m.refwo ";
                        strSql += "and m.QUANTITY <> 0 and m.ACTIVEMATNUM = am.activematnum(+) ";
                        strSql += "and w.wonum='" + woNum + "' ";
                        DataTable temp9 = da.RunSelectSQL(strSql);
                        foreach (DataRow dr9 in temp9.Rows)
                        {
                            WXPJID++;                        string ACTIVEMATNUM = dr9["实物料"].ToString();
                            string description = dr9["实物料描述"].ToString();
                            string QUANTITY = dr9["发放数量"].ToString();                        insertSql = "insert into ENQ_SERVICEPARTS(ID,WXBH,KCBM,MS,SL,CLFS) ";
                            insertSql += "values (" + WXPJID + ",'" + this.ToSBC(woNum) + "','" + this.ToSBC(ACTIVEMATNUM) + "','" + this.ToSBC(description) + "','" + this.ToSBC(QUANTITY) + "','')";                        sqlArr.Add(insertSql);
                        }                    //库存项目发放
                        strSql = "select w.wonum 工单号,w.description 工单描述,w.worktype 工单类型,m.itemnum 库存项目编码,";
                        strSql += "i.description 库存项目描述,m.QUANTITY 发放数量 ";
                        strSql += "from workorder w,(select s.siteid, s.itemnum, s.refwo, s.itemsetid, ";
                        strSql += "sum(decode(s.issuetype,'ISSUE', abs(s.QUANTITY), 'RETURN', -abs(s.QUANTITY))) QUANTITY from matusetrans s ";
                        strSql += "where s.issuetype in ('ISSUE','RETURN') group by s.siteid, s.itemnum, s.refwo, s.itemsetid) m,item i ";
                        strSql += "where w.istask <> 1 and w.status <> 'CAN' and w.siteid = m.siteid and w.wonum = m.refwo ";
                        strSql += "and m.QUANTITY <> 0 and m.itemnum = i.itemnum(+) and m.itemsetid = i.itemsetid(+) ";
                        strSql += "and w.wonum='" + woNum + "'";
                        DataTable temp10 = da.RunSelectSQL(strSql);
                        foreach (DataRow dr10 in temp10.Rows)
                        {
                            WXPJID++;                        string itemnum = dr10["库存项目编码"].ToString();
                            string description = dr10["库存项目描述"].ToString();
                            string QUANTITY = dr10["发放数量"].ToString();                        insertSql = "insert into ENQ_SERVICEPARTS(ID,WXBH,KCBM,MS,SL,CLFS) ";
                            insertSql += "values (" + WXPJID + ",'" + this.ToSBC(woNum) + "','" + this.ToSBC(itemnum) + "','" + this.ToSBC(description) + "','" + this.ToSBC(QUANTITY) + "','')";                        sqlArr.Add(insertSql);
                        }                    #endregion
                    }            }            try
                {
                    da.RunSqlArrTran(sqlArr);                da.SaveLogs("成功执行Insert Sql语句条数:" + sqlArr.Count + "行");                if (endID < 35710000)
                    {
                        startID = startID + stepNum;
                        endID = endID + stepNum;                    this.RunDataPanel();
                    }
                    else
                    {
                        MessageBox.Show("Success,所有数据已处理完毕!");
                    }
                }
                catch (Exception ex)
                {
                    da.SaveLogs("发生未知错误!" + ex.Message + "   当前数据处理到StartID=" + startID + "!");
                    MessageBox.Show("发生未知错误!" + ex.Message + "   当前数据处理到StartID=" + startID + "!");
                }
            }
      

  3.   

    3点建议:
    1.string改成stringBuilder.
    2.ArrayList改成泛型。
    3.不要foreach datarow  。
      

  4.   

    建议考虑一下SQL语句的优化,找出最合适\高效的语句
      

  5.   

    在循环中频繁出现类似
    select distinct f.CUSTDESCCN 故障现象, f1.CUSTDESCCN 原因分析 ";
                    strSql += "from workorder w, failurecode f0, extwo01 e, CUSTFAILUREREPORT c, failurecode f, CUSTFAILUREREPORT c2, failurecode f1 ";的多表查询。你不如先一次把结果放到一张临时表,程序对临时表操作。我相信速度会有很大提升
      

  6.   

    代码太多,我没仔细看
    说下我的想法,先在Oracle10 里做好视图,处理程序需要用的,并且要优化好,让查询速度快起来
    这样处理起来程序里边就不会那么多查询了记录处理的标记,方便中间出错,又得删处理后的数据,重头来处理程序我之前处理5000万数据就是这样弄的
      

  7.   

    不要foreach datarow ,那么可以介绍下其他方法参考否?
      

  8.   

    把索引disable掉,再写数据,然后重新生成索引
      

  9.   

    以上差不多都说中了,首先是,数据库层面:肯定不是现有数据库影响操作,是愿数据库的问题,可以索引上面优化下,使得查询快一点,还有就是使用视图,使用存储过程,
    代码上:数据量那么大,不要拼装任何的sql语句
    现数据库,可以暂时取消表关系,取消主键的自动递增,插入也可以写存储过程
    最后说逻辑:你都是从总-分-分的关系遍历查询的,很多查询都是多余的,查出总1个,接下来分100个,再分10000个,也就是说,本来可以只需要查询3次,你却查询了10000次,再说添加可以使用批处理C#那个什么可以一个datatable的数据全部一次性添加的,只需要几次,你却sql一条一条的添加了10000次之多,数据随便举的哈
    你想想是不是那样的
    你整理下源数据库表以及关系,和新数据库表和关系,然后通过视图,什么的,一次性当张表或者简单的关联表查询几十万条直接插入对应新表,你的几十个表,整理下之后依次存入新表,这个应该会很快的,因为查询中根本就不存在多少where语句
    新数据库,完成了之后存在很多问题,比如说不关联的数据什么的,冗余数据,这些都很好说了撒,写个程序,慢慢的去验证,验证不正确就删掉,这个时候肯定也不急时间了吧,验证也要注意顺序总-分-分,比如遍历外键表,看这个外键是否成立,不成立就删掉,这个应该也不会要多少时间吧,就算,一时没有验证出来,也不影响新数据库的业务操作,是吧,把所有的验证做好了之后,就可以给新数据库添加键关系什么的咯楼主你看看这个合理不
      

  10.   

    不要用这个办法  速度太慢 
    要用VS自带的一个类库
    我贴点示例代码上来  具体的操作你在上网上看看  比你这快很多//省略连接字符串   
     SqlConnection conn = new SqlConnection(".....");  
     conn.Open();  
    //初始化类   
     using (System.Data.SqlClient.SqlBulkCopy sqlBC = new System.Data.SqlClient.SqlBulkCopy(conn))  
     {  
         //获取需要导入的数据表   
         DataTable dt = GetDataTable();  
      
         //每10W条数据一个事物   
         sqlBC.BatchSize = 100000;  
     
        //超时时间   
         sqlBC.BulkCopyTimeout = 60;  
      
         //表名Users   
         sqlBC.DestinationTableName = "dbo.Users";  
      
         //字段对应,分表为原数据表字段名,和导入数据库的字段名   
         sqlBC.ColumnMappings.Add("Access_ID", "MSSQL_ID");  
         sqlBC.ColumnMappings.Add("Access_Name", "MSSQL_Name");  
         //sqlBC.ColumnMappings.Add("Access_...", "MSSQL_...");   
         //sqlBC.ColumnMappings.Add("Access_...", "MSSQL_...");   
      
         //导入到数据库   
         sqlBC.WriteToServer(dt);  
      

  11.   

    利用SqlBulkCopy类 批量导入数据到sql server .http://blog.csdn.net/keenweiwei/article/details/6869465