SQLServer数据批量导入:多种方法详解及性能对比
创始人
2024-12-19 18:26:10
0 次浏览
0 评论
sql2000,如何将多张表的数据批量导入到一张表(具有相同字段)?
插入目标表select*fromtable1unionselect*fromtable2SQLServer数据批量导入的几种方式
批量导入SQLServer数据的几种方法说到批量导入SQLServer数据,这里提供一些常用的方法进行对比,我们将详细讲解每种方法的使用方法(本文代码使用C#语言)。import方法需要写代码导入吗?该进程将数据插入多个表的速度有多快?数据导入是否需要写SQL语句1.使用SQLServer客户端管理工具FF快FF2,或者使用存储过程TT慢TT3,SQLServer表值参数TT快TT1使用SQLServer客户端管理工具,SQL打开服务器客户端并连接选择要操作的数据库引擎,选择任务--导入数据,弹出如下图:点击下一步一般情况下,要导入的数据是Excel,我们选择数据源为MicrosoftExcel。
(不同版本会有一些差异),浏览并选择要导入的Excel文件;接下来选择目标数据源,选择我们的SQLServer,然后根据需要点击下一步。
需要关注选择表和数据源页面,根据实际需要选择对应的表,并编辑列映射,最后点击完成导入数据。
2.循环调用insert语句或存储过程。
该方法是读取文件数据后,调用编写的SQL语句或存储过程将数据循环插入数据库,可以根据需要对数据进行验证和处理。
下面的代码是循环插入的实现。
如果需要输出导入进度,可以使用BackgroundWorker+ProgressBar在页面显示导入进度;(路径);inti=0;数据库连接stringstrConn=System.Configuration.ConfigurationManager.AppSettings["SsConnString"];SqlConnectionCoon=newSqlConnection(strConn);if(Coon.State.Equals(ConnectionState.Closed)){Coon.Open();}foreach(DataRowdrinm_dt.Rows){i++;if(bkWorker.CancellationPending){e.Cancel=true;return-1;}SqlParameter[]parms={newSqlParameter("@Name",SqlDbType.VarChar,32),newSqlParameter("@Sheng",SqlDbType.VarChar),newSqlParameter("@City",SqlDbType.VarChar),newSqlParameter("@Xian",SqlDbType.VarChar)};try{parms[0].Value=(dr["Name"]+"").Trim();parms[7].Value=dr["省"]+"";parms[8].Value=dr["城市"]+"";parms[9].Value=dr["县"]+"";}catch(异常){MessageBox.Show("请确保数据表中的列名与模板中的列名一致!","警告",MessageBoxButtons.OK,MessageBoxIcon.Warning);return-1;}trydo{SqlCommandCmd=Tools.CreateCmd('P_Data_Import',parms,Conn);intiRet=Cmd.ExecuteNonQuery();if(iRet==0){继续;}}catch(ionex除外){Tools.Log_Write("th"+(m_dt.Rows.IndexOf(dr)+1).ToString()+"行导入错误:"+ex.Message,"d:\dataimportlog.txt");继续;}}if(MessageBox.Show('数据导入完成!打开导入日志!","提示")==DialogResult.OK){this.buttonImport.Enabled=true;if(File.Exists(path))System.Diagnostics.Process.Start(path);}Conn.Close();return-1;}//打开数据库连接publicstaticSqlConnectionReturnConn(){stringstrConn='server=数据库地址;uid=数据库账号;pwd=密码;database=数据库Name"SqlConnectionCoon=newSqlConnection(strConn);if(Coon.State.Equals(ConnectionState.Closed)){Coon.Open();}returnCoon;}//执行带参数的存储过程publicstaticSqlCommandCreateCmd(stringprocName,SqlParameter[]prams,SqlConnectionConn){SqlConnectionSqlConn=Conn;if(SqlConn.State.Equals(ConnectionState.Closed)){SqlConn.Open();}SqlCommandCmd=newSqlCommand();Cmd.CommandType=CommandType.StoredProcedure;Cmd.Connection=SqlConn;Cmd.CommandText=procName;if(prams!=null){foreach(SqlParameterparameterinprams){if(parameter!=null){Cmd.Parameters.Add(parameter);}}}returnCmd;}3.使用SqlBulkCopy下面以导入学生取消数据为例。
关于SqlBulkCopy的使用(官方解释:允许你使用其他来源的数据来有效地加载SQLServer表。
),网上可以找到很多资料。
官方的DocumentExpress首先要格式化要导入的数据DataTable类型对象(TransferData),其设置以及数据源的列映射关系用于计算导入数据所需的时间PrivatevoidInsertTwo(){OpenFileDialogfd=newOpenFileDialog();if(fd.ShowDialog()!=DialogResult.OK){return;}Stopwatchsw=newStopwatch();//创建数据表ColumnDataTabledt=Tools.TransferData(fd.FileName,"Sheet1","");dt.Columns.Add(xhFee);this.btn_Import.Enabled=false;stringstrConn=System.Configuration.ConfigurationManager.AppSettings["SsConnString"];(SqlCon)usingnectionconn=newSqlConnection(strConn)){SqlBulkCopybulkCopy=newSqlBulkCopy(conn);bulkCopy.DestinationTableName='T_FI_IncomeDetail';bulkCopy.BatchSize=dt.Rows.Count;//设置列对应bulkCopy.ColumnMappings.add('教程类型','fd'Id");bulkCopy.ColumnMappings.Add("消耗的课程或课程","XhKeshi");bulkCopy.ColumnMappings.Add("消耗日期","CreateTime");bulkCopy.ColumnMappings.Add('学生姓名','name');conn.Open();sw.Start();inttotalRow=dt.Rows.Count;if(dt!=null&&dt.Rows.Count!=0){dateTimeDelete.Value=Convert.ToDateTime(dt.Rows[0]["消费日期"]);bulkCopy.WriteToServer(dt);sw.stop();并填写到DataTablepublicstaticTransferData中(stringexcelFile,stringSheetName,stringstrScreen){System.Data.DataTabledt=newSystem.Data.DataTable();try{//获取所有数据stringsstrConn='Provider=Microsoft.Ace.Oledb.12.0;DataSource="+excelFile+";ExtendedProperties='Excel12.0;HDR=YES;IMEX=1;'";OleDbConnectionconn=newOleDbConnection(strConn);conn.Open();OleDbDataAdaptermyCommand=null;myCommand=newOleDbDataAdapter("从[Sheet1$]中选择*"+strScreen,strConn);myCommand.Fill(dt);conn.Close();}catch(Exceptionex){MessageBox.Show(ex.Message);}returndt;}4.使用SQLServer表值参数。
当需要批量导入数据,并对影响多个表的数据进行逻辑运算时,这种方法尤其实用。
我亲自测试的这个例子由于存储过程中逻辑复杂,使用游标处理2000条数据,2秒就可以完全导入。
主要是应用SQLServer的表类型参数,将表数据传递给存储过程,数据库所有的SQL操作都可以在其中执行,从而提高操作性能。
首先,您需要在数据库中创建自定义表类型。
创建语句格式如下:CREATETYPE[dbo].[UserInfo]ASTABLE([Name][varchar](32)NULL,[Code][varchar](32)NULL,[Gender][varchar](32)NULL,[Birthday][DateTime]NULL)如何使用存储过程:UserInfo是一个自定义表类型,已使用createprocprocName(@DataTableUserInformreadonly)asbegin创建-它自己的逻辑对。
@ApplyData该表可以像普通表一样使用。
--建议@DataTable如果需要联表过滤数据,请使用临时表,否则可能会导致超过数据库设置的最大查询时间。
(在数据库引擎中,右键属性——可以查看连接过程中的查询控制器,防止查询时间过长。
如果不勾选查询,默认是30s——建议逻辑操作)。
如果可以用代码处理,就不要放在存储过程中,为了减轻数据库服务器的压力,最后的代码调用是示例:PrivateintDataImport1(objectsender){Stopwatchsw=newStopwatch();sw.Start();stringpath='d:\\数据导入Log.txt";if(File.Exists(path))File.Delete(path);intcount=m_dt.Rows.Count;SqlConnectionConn=SsZongs.ReturnConn();DataTabledt=newDataTable("userIfo");dt.Columns.Add("姓名",typeof(string));dt.Columns.Add("代码",typeof(string));dt.Columns.Add("性别",typeof(String));dt.Columns.Add("生日",typeof(DateTime));try{for(inti=0;i
怎样在Sql server中循环批量insert
在SQLServer中,批量数据插入的循环操作比较复杂,因为SQL语言虽然没有直接的for循环语句,但是可以通过while循环来完成。
通常,批量数据输入不需要这样的循环,因为数据通常以一定的顺序或逻辑关系存在,而不是在每个数据项之间具有显式链接。
如果确实需要使用for循环进行批量插入,常见的方法是使用C#代码连接到VisualStudio中的数据库。
通过编写循环逻辑,一条一条地执行insert语句,实现批量插入能力。
具体步骤如下:
创建或打开C#项目,并确保选择适当的驱动程序来与数据库交互(例如ADO.NET)。
编写while循环,识别数据源(例如数组或列表),并在循环内构建SQLINSERT语句。
在循环内,使用SqlCommand对象执行每个INSERT语句并处理可能的错误和异常。
循环结束后,关闭数据库连接并确保所有数据已成功插入。
这样,通过灵活的C#代码编程,即使不直接for循环,也可以实现批量数据插入SQLServer。
然而,这并不是SQLServer本身的特性,而是借助编程语言的强大功能来实现的。
相关文章
C语言编程:简单实现圣诞树打印
2024-12-17 08:40:06Python格式化输出:掌握两种语法,提...
2024-12-14 21:59:32C语言实现字符串输入、逆序存储及打印全攻...
2024-12-15 16:10:04阿里云:引领云计算新时代,助力DT世界价...
2024-12-18 06:26:58JavaScript变量声明:var、l...
2024-12-16 06:27:40C语言实现字符串指定字符删除技巧与代码解...
2024-12-15 22:26:55C语言编程:计算整数序列和与平均值,及找...
2024-12-20 06:59:16C语言基础:使用cout输出字符串方法详...
2024-12-17 04:09:24解析JS字符串处理技巧:双逗号替换与符号...
2024-12-15 12:36:42Java编程实战:矩形计算与数组排序详解
2024-12-16 04:12:46最新文章
22
2024-12
22
2024-12
22
2024-12
22
2024-12
22
2024-12
22
2024-12
22
2024-12
22
2024-12
22
2024-12
22
2024-12
热门文章
1
Python排列组合与循环运用技巧解析
怎样使用Python进行排列组合?对于这类问题,我们可以使用分割循环来执行转换和...
2
C语言实现字符串倒序输出教程
请教C语言字符串倒序输出#include#includevoidmain(){c...
3
Python字符串比较原理:基于ASCI...
Python基础:如何比较两个字符串对象在Python中,字符串大小比较是基于字...
4
Java工具类:使用Apache POI...
java实现读取word文件、读取表格1、导入对应的依赖包org.apache....
5
C语言字符串转整数:两种实现方法详解
怎么把字符串转换成整数?将字符串转换为整数有两种方法:1.使用C语言自带的库函数...
6
Python列表格式化输出技巧:f-st...
python中请问怎么格式化输出列表在Python中,您可以使用字符串格式化函数...
7
探索非传统方法:JAVA实现100-99...
JAVA,输出100到999的素数,,代码如下,但这不是传统的查找素数的方法。公...
8
C语言实现字符串大小写转换:字符类型判断...
C语言把一个字符串里所有的大写字母换成小写字母,小写字母换成大写字母.其他字符保...
9
Python字符串格式化:深入理解for...
Python小知识:用format格式化输出字符串Python使用format格...
10
程序员浪漫表白:用代码谱写烟花般爱情的编...
程序员的表白代码程序员信条第一语言:Java代码翻译:我每天爱你一点,直到我死代...