• SQLServer对拼接的SQL语句有长度限制吗?
  • 发布于 2个月前
  • 853 热度
    3 评论
  • 我怕黑
  • 22 粉丝 39 篇博客
  •   

我有一个程序需要从Excel读取数据,并进行数据库的更新操作,我是通过循环读取Excel的数据进行拼接SQL操作的,但是这个Excel数据有十几万条,这样循环拼接的话SQL字符串的长度会达到百万级的长度,这种长度的SQL语句SQLServer进行查询会有问题吗?

我的代码类似如下:

                foreach (DataRow dataRow in dt.Rows)
                        {
                            if (!string.IsNullOrEmpty(dataRow[0].ToString()) && !string.IsNullOrEmpty(dataRow[1].ToString()))
                            {
                                sql += string.Format("update uf_gysxxb set lxhszyxmc='{0}' where BANKL='{1}'; ", dataRow[1].ToString().Trim(), dataRow[0].ToString().Trim());
                            }
                        }

用户评论
  • 温柔在手心
  • 十几万条的数据这样拼接成一个SQL执行是行不通的,数据库执行肯定会出现超时。可以考虑拆分成几个子的SQL,然后用多线程去分别执行各个子SQL
  • 2022/5/17 9:01:00 [ 0 ] [ 0 ] 回复
  • pckillers
  • 大批量更新,难道你没听过SQLBulkCopy这种东西吗?


    public static void UpdateData<T>(List<T> list,string TableName)
    {
        DataTable dt = new DataTable("MyTable");
        dt = ConvertToDataTable(list);
        ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.PerUserRoamingAndLocal);
        using (SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["SchoolSoulDataEntitiesForReport"].ConnectionString))
        {
            using (SqlCommand command = new SqlCommand("", conn))
            {
                try
                {
                    conn.Open();
    
                    //在数据库创建要给临时表
                    command.CommandText = "CREATE TABLE #TmpTable(...)";
                    command.ExecuteNonQuery();
    
                    //把数据批量插入临时表
                    using (SqlBulkCopy bulkcopy = new SqlBulkCopy(conn))
                    {
                        bulkcopy.BulkCopyTimeout = 660;
                        bulkcopy.DestinationTableName = TableName;
                        bulkcopy.WriteToServer(dt);
                        bulkcopy.Close();
                    }
    
                    // 更新目标表,并删除临时表
                    command.CommandTimeout = 300;
                    command.CommandText = "UPDATE T SET ... FROM " + TableName + " T INNER JOIN #TmpTable Temp ON ...; DROP TABLE #TmpTable;";
                    command.ExecuteNonQuery();
                }
                catch (Exception ex)
                {
                    // 异常处理
                }
                finally
                {
                    conn.Close();
                }
            }
        }
    }
    --------------------插入代码结束(*^_^*) ----------------


  • 2022/5/9 15:13:00 [ 0 ] [ 0 ] 回复
  • 心已凉
  • 十几万的数据这样循环拼接?我没听错吧?这种十几万的SQL拼接成一条SQL的情况没遇到过,不知道SQLServer会不会报错,如果会报错的话你可以尝试每一万行数据拼接成一条SQL,这样拼接成十几个SQL分开执行就好了,不过感觉你这种处理方式效率有点低啊。
  • 2022/5/9 15:09:00 [ 0 ] [ 0 ] 回复