用SQL批量插入数据

用SQL批量插入数据.txt什么叫神话?请听男人向你表达爱意;什么叫传说?请听男人对你的承诺;什么叫梦境?请看你自己听到前两者时的反应。

用SQL批量插入数据
<script>
var s1 = "2007-11-02";
var s2 = "2007-11-02";
var ss1=new Date(s1.replace(/-/g,"/"));
var ss2=new Date(s2.replace(/-/g,"/"));
if(ss1>ss2)alert(s1+"大于"+s2);
if(ss1=ss2)alert(s1+"等于"+s2);
if(ss1<ss2)alert(s1+"小于"+s2);
</script>
对时间比较
var s1 = "2007-11-02";
var s2 = "2007-11-02";
var now = new Date();
for(var i = 0; i < 100000;i++ ){
var ss1=new Date(s1.replace(/-/g,"/"));
var ss2=new Date(s2.replace(/-/g,"/"));
}
now = new Date() - now;
var now1 = new Date();
for(var i = 0; i < 100000;i++ ){
var ss1=parseInt(s1.replace(/-/g,""));
var ss2=parseInt(s2.replace(/-/g,""));
}
now1 = new Date() - now1;
document.write("实例化日期花费时间:" + now + "\n解析为整数花费时间:" + now1); </script>
用SQL批量插入数据
涉及表和维度,立方:事实表sales_fact_1997,维度表time_by_day;立方:sales
修改内容:删除原来的TIME维度,新建TIME维度,修改SALES立方。

数据插入:
1,事实数据插入:通过DTS加调度实现将sales_fact_1997
的数据进行复制。

频率为每分钟10000条。

主要用到的SQL语句:select top
10000 * from sales_fact_1997
2,维度数据插入:通过SQL语句插入数据到time_by_day.
测试用到的SQL语句:
1,单条插入
INSERT INTO time_by_day
(time_id, the_date, the_year, month_of_year,
quarter,day_of_month)
VALUES ('1101', '1999-10-1', '1999', '10',
'Q4','1')
2,单条插入:
INSERT INTO time_by_day
(time_id, the_date, the_year, month_of_year, quarter, day_of_month)
SELECT TOP 1 time_id + 1 AS time_id, the_date + 1 AS the_date, YEAR(the_date + 1)
AS the_year, MONTH(the_date + 1) AS
month_of_year, { fn QUARTER(the_date + 1)
} AS quarter, DAY(the_date + 1) AS
day_of_month
FROM time_by_day
ORDER BY time_id DESC
3,循环插入:
DECLARE @MyCounter INT
SET @MyCounter = 0 /*设置变量*/
WHILE (@MyCounter < 2) /*设置循环次数*/
BEGIN
WAITFOR DELAY '000:00:10' /*延迟时间10秒*/
INSERT INTO time_by_day
(time_id, the_date, the_year, month_of_year, quarter, day_of_month)
SELECT TOP 1 time_id + 1 AS time_id, the_date + 1 AS the_date, YEAR(the_date + 1)
AS the_year, MONTH(the_date + 1) AS
month_of_year, { fn QUARTER(the_date + 1)
} AS quarter, DAY(the_date + 1) AS
day_of_month
FROM time_by_day
ORDER BY time_id DESC
SET @MyCounter = @MyCounter + 1
END
4,插入以时间为变量的数据
DECLARE @MyCounter INT
declare @the_date datetime
SET @MyCounter = 0
SET @the_date = '1999-1-4'
WHILE (@MyCounter < 200000)
BEGIN
WAITFOR DELAY '000:00:10'
/*INSERT INTO time_by_day
(time_id, the_date, the_year, month_of_year, quarter, day_of_month)
SELECT TOP 1 time_id + 1 AS time_id, the_date + 1 AS the_date, YEAR(the_date + 1)
AS the_year, MONTH(the_date + 1) AS
month_of_year, { fn QUARTER(the_date + 1)
} AS quarter, DAY(the_date + 1) AS
day_of_month
FROM time_by_day
ORDER BY time_id DESC
*/
insert into time_by_day
(time_id,the_date)values('371',@the_date)
SET @the_date = @the_date + 1
SET @MyCounter = @MyCounter + 1
END。

合集下载

sqlserver中的大数据的批量操作(批量插入,批量删除)

sqlserver中的大数据的批量操作(批量插入,批量删除)

sqlserver中的⼤数据的批量操作(批量插⼊,批量删除)⾸先我们建⽴⼀个测试⽤员⼯表---创建⼀个测试的员⼯表---create table Employee(EmployeeNo int primary key, --员⼯编号EmployeeName nvarchar(50) null, --员⼯名称CreateUser nvarchar(50) null, --创建⼈CreateDate datetime null, --创建时间)执⾏后结果:那么假如我们要批量插⼊10000条数据,应该怎么办?这⾥有四种⽅法(普通循环,事务循环、批量插⼊、cte插⼊)1、普通循环插⼊(while)/**********************************************普通循环(插⼊数据10000,执⾏时间:1283毫秒)********************************************/--开启开关(记录sql语句各个阶段所消耗的时间)---set statistics time on;--声明两个变量---declare@Index int;declare@Timer datetime;--对两个变量进⾏赋值----set@Index=1;set@Timer=GETDATE();--当循环⼩于1000次执⾏添加语句---while@Index<=10000begin--执⾏添加的语句--insert into Employee(EmployeeNo,EmployeeName,CreateUser,CreateDate)values(@Index,'员⼯'+cast(@Index as CHAR(5)),'system',GETDATE())--设置循环次数加1set@Index=@Index+1end--获取执⾏的毫秒数--select DATEDIFF(MS,@Timer,GETDATE()) as'执⾏时间(毫秒)'--关闭开关(记录SQL语句各阶段所消耗的时间)set statistics time off;执⾏普通循环插⼊10000条数据,⼤概需要1200多毫秒,结果如图所⽰2、事务循环插⼊/**********************************************事务循环(插⼊数据1000,执⾏时间:460毫秒)********************************************/--开启事务--begin tran;--开启开关(记录sql语句各个阶段所消耗的时间)---set statistics time on;--声明两个变量---declare@Index int;declare@Timer Datetime;--对两个变量进⾏赋值----set@Index=1;set@Timer=GETDATE();--当循环⼩于1000次执⾏添加语句---while@Index<=10000begin--执⾏添加的语句--insert into Employee(EmployeeNo,EmployeeName,CreateUser,CreateDate)values(@Index,'员⼯'+cast(@Index as CHAR(5)),'system',GETDATE())--设置循环次数加1set@Index=@Index+1end--获取执⾏的毫秒数--select DATEDIFF(MS,@Timer,GETDATE()) as'执⾏时间(毫秒)'set statistics time off;--提交事务--commit;执⾏事务循环插⼊10000条数据,⼤概需要400多毫秒,结果如下所⽰:3、批量插⼊/**********************************************批量插⼊(插⼊数据10000,执⾏时间:33毫秒)********************************************/--开启开关(记录sql语句各个阶段所消耗的时间)--set statistics time on;--声明⼀个时间变量---declare@Timer datetime;---对时间变量进⾏赋值---set@Timer=GETDATE();---执⾏批量操作的sql语句---insert Employee(EmployeeNo,EmployeeName,CreateUser,CreateDate)select top(10000) EmployeeNo=ROW_NUMBER() over( order by c1.[object_id]),'员⼯','system',GETDATE()from sys.columns as c1 cross join sys.columns as c2order by c1.object_id--获取执⾏的毫秒数--select DATEDIFF(MS, @Timer, GETDATE()) AS[执⾏时间(毫秒)];--关闭开关(记录SQL语句各阶段所消耗的时间)--SET STATISTICS TIME OFF;执⾏批量插⼊10000条数据,⼤概只要33毫秒,结果如图所⽰:4、CTE插⼊--/*******************************************--***CTE插⼊(插⼊数据10000,执⾏时间:40毫秒)--********************************************/--开启开关(记录sql语句各个阶段所消耗的时间)--set statistics time on;--声明⼀个时间变量并赋值--declare@Timer datetime=GETDATE();---将要添加10000条语句组合成CTE模块---;with CTE(EmployeeNo,EmployeeName,CreateUser,CreateDate) as (select top(10000) EmployeeNo = ROW_NUMBER() over (order by C1.[OBJECT_ID]), '员⼯', 'system', GETDATE()from SYS.COLUMNS as C1 cross join SYS.COLUMNS as C2order by C1.[OBJECT_ID])--执⾏CTE插⼊语句---insert Employee select EmployeeNo,EmployeeName,CreateUser,CreateDate from CTE;--获取执⾏的毫秒数--select DATEDIFF(MS, @Timer, GETDATE()) as[执⾏时间(毫秒)];---关闭开关(记录sql语句各个阶段所消耗的时间)---set statistics time off;执⾏插⼊10000条数据,⼤概需要40毫秒,结果如图所⽰:最后我们查看⼀下,批量插⼊10000条数据的员⼯表⼩结:1)按执⾏时间,效率依次为:CTE和批量插⼊效率相当,速度最快,事务插⼊次之,单循环插⼊速度最慢;2)单循环插⼊速度最慢是由于INSERT每次都有⽇志,事务插⼊⼤⼤减少了写⼊⽇志次数,批量插⼊只有⼀次⽇志,CTE的基础是CLR,善⽤速度是最快的那么,假如我们要批量删除我们插⼊的数据,怎么办呢?批量删除有3中⽅法(循环删除、批量删除、truncate 删除)1、循环删除--/*******************************************--***循环删除(删除数据10000,执⾏时间:20毫秒)--********************************************/set statistics time on;--声明⼀个时间变量---declare@Timer datetime=GETDATE();--删除语句--delete from Employee--获取执⾏的毫秒数--select DATEDIFF(MS, @Timer, GETDATE()) as[执⾏时间(毫秒)];set statistics time off;删除10000条数据,所需的时间⼤概为20毫秒,如下所⽰:2、批量删除/**********************************************批量删除(删除数据10000,执⾏时间:23毫秒)********************************************/set statistics time on;declare@Timer datetime=GETDATE();SET ROWCOUNT10000;while1=1begin--开启事务--begin tran--执⾏删除--delete from Employee;--提交事务--commit;IF@@ROWCOUNT=0break;endset ROWCOUNT0;--获取执⾏的毫秒数---select DATEDIFF(MS, @Timer, GETDATE()) as[执⾏时间(毫秒)];set statistics time off;删除10000条数据,所需的时间⼤概为23毫秒,如下所⽰:3、truncate删除--/*******************************************--***truncate删除(删除数据10000,执⾏时间:3毫秒)--********************************************/set statistics time on;--声明⼀个时间变量--declare@Timer datetime=getdate();--执⾏truncate语句--truncate table Employee---获取执⾏的毫秒数---select DATEDIFF(MS, @Timer, GETDATE()) as[执⾏时间(毫秒)]set statistics time off删除10000条数据,所需的时间⼤概为3毫秒,如下所⽰:⼩结:1)TRUNCATE太快了,清除10W数据⼀点没压⼒,批量删除次之,最后的DELTE太慢了2)TRUNCATE快是因为它属于DDL语句,只会产⽣极少的⽇志,普通的DELETE不仅会产⽣⽇志,⽽且会锁记录PS:。

SQL大批量插入数据的方式(多表关联).

SQL大批量插入数据的方式(多表关联).

SQL⼤批量插⼊数据的⽅式(多表关联).前段时间,在⼯作中遇到这个需求,需要⼤批量插⼊⼏万条甚⾄⼏⼗万的数据。

因为业务特殊,多张表的相互关联,通常做法是先往主表⾥⾯插⼊⼀条数据,然后获取主表的主键ID,再往其他关联的表⾥⾯插⼊ID的关联数据。

刚开始做的时候,想到⽤事务,把⼏万条SQL拼装起来,在⼀个事务⾥⾯去执⾏,结果很壮烈,执⾏性能⾮常糟糕。

⼏千条业务数据执⾏了⼏分钟。

⽤代码分析⼯具Dottrace⼀查,发现单单操作数据库的时间占了99.9%。

(Dottrace,代码性能分析⼯具,它分dottrace Performance和dottrace Memory两个⼯具,dottrace Performance⽤来分析代码性能,⽐如函数执⾏时间,调⽤次数,消耗时间⽐率等,dottrace Memory⼀般⽤来分析内存占⽤情况。

⼤家如果有兴趣的同学可以去下载玩下,对代码优化⼯作很有帮助的。

)⾔归正传,去⽹上搜了很多资料,原来2.0有⼀个新的特性:SqlBulkCopy,效率还是很⾼的。

然后结合⾃⼰的业务需求,修改了下代码。

现在跟⼤家⼀起来学习下。

(因为也是参考前辈写的资料,所以下⾯的⽰例都⼤同⼩异)建⽴测试数据库(BulkTestDB)、主表(BulkTestMain)、从表(BulkTestDetail)--Create DataBasecreate database BulkTestDB;gouse BulkTestDB;go--Create TableCreate table BulkTestMain(Id int primary key,GuidId long,--辅助的唯⼀标识Batch long,--导⼊的批次标识Name nvarchar(32)goCreate table BulkTestDetail(Id int primary key,PId int,Lesson nvarchar(32)go数据库建⽴完毕,开始编写后台代码View Codepublic void TestMain(){using (SqlConnection connection = new SqlConnection("你的链接字符串")){connection.Open();SqlTransaction transaction = connection.BeginTransaction("Transaction1");DataTable dtTestMain= GetTableSchema("BulkTestMain");//构建BulkTestMain表结构DataTable dtTestDetail = GetTableSchema("BulkTestDetail");//构建BulkTestDetail表结构Guid Batch = Guid.NewGuid();//插⼊的批次,为后⾯查询dtTestMainTmp 做条件for (int i = 0; i < 1000000; i++)//测试100w条数据{DataRow dr= dtTestMain.NewRow();Guid newGuid = Guid.NewGuid();dr["_GuidId"] = newGuid;dr["_Batch"] = Batch;dr["_UserName"] = "测试" + i.ToString();dtTestMain.Rows.Add(dr);for(int j = 0;j<10;j++)//给从表每次插⼊10条数据{DataRow dr1 = dtTestDetail.NewRow();dr1["_GuidId"]= newGuid;dr1["_Lesson"]="课程"+j.ToString();dtTestDetail.Rows.Add(dr1);}//这样做的⽬的,让主表与从表可以临时通过GuidId关联起来}BulkToDB(dtTestMain, "BulkTestMain", connection, transaction);//先让BulkTestMain插⼊了⼤量的数据,注意这些数据是临时的,在SqlTransaction提交之前,查询时要⽤with(nolock) DataSet dtTestMainTmp = GetNewImportData(Batch.ToString());//好吧,我们来查询下,刚才⼤量插⼊的10w条数据,这⾥只需要查询标识的2列字段Dictionary<string, long> dicGuidToID = new Dictionary<string, long>();foreach (DataRow dr in dtTestMainTmp.Tables[0].Rows){dicGuidToID.Add(dr[1].ToString(), Convert.ToInt64(dr[0]));}//dicGuidToID:guid字段与插⼊的主表ID字段关联起来成字典,⽤字典是为了访问起来效率(为什么获取字典key的值效率很⾼,有兴趣的可以去研究“散列表”的概念)foreach (DataRow dr in dtTestDetail.Rows)//现在给dtTestDetail的PId字段赋值(PId字段与主表Id外键关联){dr["_PId"] = dicGuidToID[dr["_GuidId"].ToString()].ToString();}dtTestDetail.Columns.Remove("_GuidId");//移除dtTestDetail的GuidId字段,使它与数据库列匹配BulkToDB(dtTestDetail,"BulkTestDetail",connection, transaction);//给从表插⼊数据mit();connection.Close();}}///<summary>///根据批次Batch获取导进来的临时数据///</summary>///<returns></returns>public static DataSet GetNewImportData(string batch){StringBuilder strSql = new StringBuilder();strSql.Append("SELECT [Id],[GuidId]").Append(" FROM ContactInfo WITH (NOLOCK) WHERE Batch=@batch");SqlParameter[] parameters = {new SqlParameter("@Batch", SqlDbType.BigInt){Value = batch}};DataSet ds = SqlHelper.ExecuteDataset(strSql.ToString(), parameters);return ds;}public static void BulkToDB(DataTable dtSource, string TableName,SqlConnection connection, SqlTransaction transaction) {using (SqlBulkCopy sqlBulkCopy = new SqlBulkCopy(connection, SqlBulkCopyOptions.KeepIdentity, transaction)){sqlBulkCopy.DestinationTableName = TableName;//要插⼊数据的表的名称sqlBulkCopy.BatchSize = dtSource.Rows.Count;//数据的⾏数List<SqlBulkCopyColumnMapping> mpList = getMapping(TableName);//获取表映射关系foreach (SqlBulkCopyColumnMapping mp in mpList){sqlBulkCopy.ColumnMappings.Add(mp);}if (dtSource != null && dtSource.Rows.Count != 0){sqlBulkCopy.WriteToServer(dtSource);//插⼊数据}}}public static List<SqlBulkCopyColumnMapping> getMapping(string TableName){List<SqlBulkCopyColumnMapping> mpList = new List<SqlBulkCopyColumnMapping>();switch(TableName){case"BulkTestMain":{mpList.Add(new SqlBulkCopyColumnMapping("_Id", "Id"));mpList.Add(new SqlBulkCopyColumnMapping("_GuidId", "GuidId"));mpList.Add(new SqlBulkCopyColumnMapping("_Batch","Batch"));mpList.Add(new SqlBulkCopyColumnMapping("_UserName", "UserName"));}break;case"BulkTestDetail":{mpList.Add(new SqlBulkCopyColumnMapping("_Id", "Id"));mpList.Add(new SqlBulkCopyColumnMapping("_PId", "PId"));mpList.Add(new SqlBulkCopyColumnMapping("_Lesson", "Lesson"));}break;}return mpList;}private static DataTable GetTableSchema(string TableName){DataTable dataTable = new DataTable();switch(TableName){case"BulkTestMain" :{dataTable.Columns.AddRange(new DataColumn[] {new DataColumn("_Id",typeof(Int32)),new DataColumn("_GuidId",typeof(Int64)),new DataColumn("_Batch",typeof(Int64)),new DataColumn("_UserName",typeof(String))});}break;case"BulkTestDetail":{dataTable.Columns.AddRange(new DataColumn[] {new DataColumn("_Id",typeof(Int32)),new DataColumn("_PId",typeof(Int32)),new DataColumn("_GuidId",typeof(Int64)),new DataColumn("_Lesson",typeof(String))});}break;}return dataTable;}总算把代码copy完了,任务完成。

SQLServer使用一个语句块批量插入多条记录的三种方法

SQLServer使用一个语句块批量插入多条记录的三种方法

SQLServer使⽤⼀个语句块批量插⼊多条记录的三种⽅法我们在⽇常操作中,免不了对数据库的某张表,⼀次性的要插⼊多条记录,但是⾸先想到的就是复制,粘帖N多重复的INSERT INTO 语句,万⼀某⼀个少了⼀个分号,或多个逗号之类的,产⽣错误,要找起来可就费尽了,既浪费时间,⼜耽误⼯作。

除了上⾯所说的⽅法外,其实还有⼆中⽅法,相⽐较起来要⽐之前那个要简洁。

⾸先是之前那个⽅法:复制代码代码如下:INSERT INTO MyTable(ID,NAME) VALUES(1,'123');INSERT INTO MyTable(ID,NAME) VALUES(2,'456');INSERT INTO MyTable(ID,NAME) VALUES(3,'789');第⼆种⽅法,使⽤UNION ALL来进⾏插⼊操作:复制代码代码如下:INSERT INTO MyTable(ID,NAME)SELECT 4,'000'UNION ALLSELECT 5,'001'UNION ALLSELECT 6,'002'是不是要⽐第⼀种⽅法简单点,据说要⽐第⼀种要快!第三种⽅法就有点特别了,是SQL Server2008特有的,所以,如果你不是SQL Server2008,就不能使⽤这种⽅法了,所以赶快升级吧!体验⼀下SQL Server2008给我们带了的好处。

复制代码代码如下:INSERT INTO MyTable(ID,NAME)VALUES(7,'003'),(8,'004'),(9,'005')上⾯演⽰了3种不同的⽅法来向数据库⼀次插⼊多条数据,第三种⽅法看起来⽐较简洁⾼效,推荐⼤家都赶快升级到SQL Server2008吧。

用SQL批量插入数据(原创)

用SQL批量插入数据(原创)

⽤SQL批量插⼊数据(原创)声明:本⽂为作者原创,转载者必须注明。

作者:曾进 (qq:310575)最近忙于公司BI软件性能测试,这⼏天主要测试CUBE采⽤ROLAP下,PA的并发和稳定性。

涉及表和维度,⽴⽅:事实表sales_fact_1997,维度表time_by_day;⽴⽅:sales修改内容:删除原来的TIME维度,新建TIME维度,修改SALES⽴⽅。

数据插⼊:1,事实数据插⼊:通过DTS加调度实现将sales_fact_1997的数据进⾏复制。

频率为每分钟10000条。

主要⽤到的SQL语句:select top 10000 * from sales_fact_19972,维度数据插⼊:通过SQL语句插⼊数据到time_by_day.测试⽤到的SQL语句:1,单条插⼊INSERT INTO time_by_day(time_id, the_date, the_year, month_of_year, quarter,day_of_month)VALUES ('1101', '1999-10-1', '1999', '10', 'Q4','1')2,单条插⼊:INSERT INTO time_by_day(time_id, the_date, the_year, month_of_year, quarter, day_of_month)SELECT TOP 1 time_id + 1 AS time_id, the_date + 1 AS the_date, YEAR(the_date + 1)AS the_year, MONTH(the_date + 1) AS month_of_year, { fn QUARTER(the_date + 1)} AS quarter, DAY(the_date + 1) AS day_of_monthFROM time_by_dayORDER BY time_id DESC3,循环插⼊:DECLARE @MyCounter INTSET @MyCounter = 0 /*设置变量*/WHILE (@MyCounter < 2) /*设置循环次数*/BEGINWAITFOR DELAY '000:00:10' /*延迟时间10秒*/INSERT INTO time_by_day(time_id, the_date, the_year, month_of_year, quarter, day_of_month)SELECT TOP 1 time_id + 1 AS time_id, the_date + 1 AS the_date, YEAR(the_date + 1)AS the_year, MONTH(the_date + 1) AS month_of_year, { fn QUARTER(the_date + 1)} AS quarter, DAY(the_date + 1) AS day_of_monthFROM time_by_dayORDER BY time_id DESCSET @MyCounter = @MyCounter + 1END4,插⼊以时间为变量的数据DECLARE @MyCounter INTdeclare @the_date datetimeSET @MyCounter = 0SET @the_date = '1999-1-4'WHILE (@MyCounter < 200000)BEGINWAITFOR DELAY '000:00:10'/*INSERT INTO time_by_day(time_id, the_date, the_year, month_of_year, quarter, day_of_month)SELECT TOP 1 time_id + 1 AS time_id, the_date + 1 AS the_date, YEAR(the_date + 1) AS the_year, MONTH(the_date + 1) AS month_of_year, { fn QUARTER(the_date + 1) } AS quarter, DAY(the_date + 1) AS day_of_monthFROM time_by_dayORDER BY time_id DESC*/insert into time_by_day (time_id,the_date)values('371',@the_date)SET @the_date = @the_date + 1SET @MyCounter = @MyCounter + 1END。

ORACLE中如何使用SQLLOAD批量添加数据

ORACLE中如何使用SQLLOAD批量添加数据

ORACLE中如何使用SQLLOAD批量添加数据在Oracle中,可以使用SQLLDR(SQL*Loader)工具来批量添加数据。

SQL*Loader是一个客户端工具,用于从文本文件中加载数据到Oracle表中。

以下是使用SQL*Loader批量添加数据的步骤:1. 创建一个控制文件(Control File):控制文件是一个文本文件,用于指导SQL*Loader加载数据。

它包含了数据文件的格式和数据应该如何被加载到Oracle表中的规则。

控制文件描述了目标表的结构、数据文件的格式和字段之间的映射关系。

一个控制文件可以对应多个数据文件。

2. 创建一个数据文件(Data File):数据文件是包含待加载数据的文本文件。

它可以是一个纯文本文件,也可以是包含字段分隔符的CSV或其他格式的文件。

数据文件的格式应该与控制文件中描述的格式匹配。

3.编写控制文件:控制文件是一个使用特定语法规则编写的文本文件。

它包含了以下几个部分:- LOAD DATA:指示SQL*Loader加载数据的开始。

-INFILE:指定数据文件的路径和名称。

-INTOTABLE:指定目标表的名称。

-FIELDSTERMINATEDBY:指定字段之间的分隔符。

-(列名1,列名2,...):指定数据文件中各个字段的映射关系。

字段的顺序和个数应该与目标表的列顺序和个数一致。

4. 运行SQL*Loader:打开终端(命令提示符或终端窗口),使用以下命令运行SQL*Loader:``````其中,`username`是Oracle用户名,`password`是密码,`database`是数据库名称,`controlfile.ctl`是控制文件的路径和名称。

5. 检查加载结果:运行完成后,SQL*Loader将输出加载的数据行数和错误行数。

如果有错误行,可以查看生成的日志文件以获得更多详细信息。

注意事项:- 在使用SQL*Loader加载数据之前,应该先创建目标表,确保表的结构与控制文件中描述的一致。

SQL中一次插入多条数据

SQL中一次插入多条数据

SQL中⼀次插⼊多条数据SQL中insert⼀次可以插⼊⼀条数据,我们有三种⽅法可以⼀次性插⼊多条数据。

1.语法:select 字段列表 into 新表 from 源表注意事项:此种⽅法新表是系统⾃动创建,语句执⾏前不可以存在新表,并且新表只能保留源表的标识列特性,其他约束不能保留。

若只需要源表的数据结构,我们可以在语句中添加(top 0)2.语法:insert into ⽬的表 select 字段列表 from 源表注意事项:此种⽅法⽬的表必须在语句执⾏前存在,并且每⼀列要与源表对应。

在此处还有⼀些有趣的问题,当我使⽤以下代码来插⼊多条数据时:select top0*into newstudent from studentinsert into newstudent select*from student这⾥会发⽣这样的报错:因为NewClass表中ClassId为标识列,所以我们不能插⼊值。

我们的解决办法如下:select top0*into newstudent from studentset identity_insert newstudent oninsert into newstudent (classid,classname) select*from student我们把newstudent 的标识列插⼊写为显⽰的,并且添加了列名字段便可以插⼊了。

之后我们再创建⼀个新的NewClass2:select top0*into NewClass2 from MyClassset identity_insert NewClass2 oninsert into NewClass2(ClassId,ClassName) select*from MyClass此时还会报错,这是因为我们之前设置了newclass的标识列插⼊为on,我们必须先关闭后才可以往newclass2插⼊值,代码如下:select top0*into NewClass2 from MyClassset identity_insert newclass offset identity_insert NewClass2 oninsert into NewClass2(ClassId,ClassName) select*from MyClass⾄此我们解决了使⽤第⼆种⽅法⼀次插⼊多条数据。

大批量插入数据(sqlinsert)

⼤批量插⼊数据(sqlinsert)1、批量录⼊(⽅法⼀:mybiats foreach标签)所述的MySQL和Oracle的批量插⼊区别可以看出可能有兼容性问题(使⽤Oracle 的同学重点参考下)⽽且jdbc链接Url要加上 allowMultiQueries=true参数。

*参考*<insert id="insertByExcel" parameterType="java.util.List">insert into t_zd_fertilizer ( FertilizerTypeName,FertilizerTradeName, FertilizerVender,FertilizerN, FertilizerP, FertilizerK,FertilizerContent, FertilizerUnit, FertilizerCreateTime,FertilizerRemark, FertilizerPrice, FertilizerCommend)values<foreach collection="list" item="item" index="index" separator=",">(#{item.fertilizerTypeName},#{item.fertilizerTradeName}, #{item.fertilizerVender},#{item.fertilizerN}, #{item.fertilizerP}, #{item.fertilizerK},#{item.fertilizerContent}, #{item.fertilizerUnit}, #{item.fertilizerCreateTime},#{item.fertilizerRemark}, #{item.fertilizerPrice}, #{item.fertilizerCommend})</foreach></insert>2、批量录⼊(⽅法⼆:mybatis ExecutorType.BATCH)下边这个是Mybatis的官⽅⽰例:// jdbc ⽅式@Testvoid testInsert() {try (SqlSession sqlSession = sqlSessionFactory.openSession(ExecutorType.BATCH)) {User user1 = new User(null, "Pocoyo");sqlSession.insert("insert", user1);User user2 = new User(null, "Valentina");sqlSession.insert("insert", user2);sqlSession.flushStatements();assertEquals(Integer.valueOf(50), user1.getId());assertEquals(Integer.valueOf(50), user2.getId());mit();}//另外openSession⽅法第⼆个参数是设置是否⾃动提交,可以设置为flase。

sql如何向一个表中批量插入大量数据

sql如何向⼀个表中批量插⼊⼤量数据--如果两表结构⼀样。

insert into tb1 select * from tb2--也可以尝试从excel或access或TXT等⽂件导⼊。

参考如下:导⼊导出⼤全导出到excelEXEC master..xp_cmdshell 'bcp SettleDB.dbo.shanghu out c:\temp1.xls -c -q -S"GNETDATA/GNETDATA" -U"sa" -P""'/*********** 导⼊ExcelSELECT *FROM OpenDataSource( 'Microsoft.Jet.OLEDB.4.0','Data Source="c:\test.xls";User ID=Admin;Password=;Extended properties=Excel 5.0')...xactions/*动态⽂件名declare @fn varchar(20),@s varchar(1000)set @fn = 'c:\test.xls'set @s ='''Microsoft.Jet.OLEDB.4.0'',''Data Source="'+@fn+'";User ID=Admin;Password=;Extended properties=Excel 5.0'''set @s = 'SELECT * FROM OpenDataSource ('+@s+')...sheet1$'exec(@s)*/SELECT cast(cast(科⽬编号 as numeric(10,2)) as nvarchar(255))+' ' 转换后的别名FROM OpenDataSource( 'Microsoft.Jet.OLEDB.4.0','Data Source="c:\test.xls";User ID=Admin;Password=;Extended properties=Excel 5.0')...xactions/********************** EXCEL导到远程SQLinsert OPENDATASOURCE('SQLOLEDB','Data Source=远程ip;User ID=sa;Password=密码').库名.dbo.表名 (列名1,列名2)SELECT 列名1,列名2FROM OpenDataSource( 'Microsoft.Jet.OLEDB.4.0','Data Source="c:\test.xls";User ID=Admin;Password=;Extended properties=Excel 5.0')...xactions/** 导⼊⽂本⽂件EXEC master..xp_cmdshell 'bcp dbname..tablename in c:\DT.txt -c -Sservername -Usa -Ppassword'/** 导出⽂本⽂件EXEC master..xp_cmdshell 'bcp dbname..tablename out c:\DT.txt -c -Sservername -Usa -Ppassword'或EXEC master..xp_cmdshell 'bcp "Select * from dbname..tablename" queryout c:\DT.txt -c -Sservername -Usa -Ppassword'导出到TXT⽂本,⽤逗号分开exec master..xp_cmdshell 'bcp "库名..表名" out "d:\tt.txt" -c -t ,-U sa -P password'BULK INSERT 库名..表名FROM 'c:\test.txt'WITH (FIELDTERMINATOR = ';',ROWTERMINATOR = '\n')--/* dBase IV⽂件select * fromOPENROWSET('MICROSOFT.JET.OLEDB.4.0','dBase IV;HDR=NO;IMEX=2;DATABASE=C:\','select * from [客户资料4.dbf]')--*/--/* dBase III⽂件select * fromOPENROWSET('MICROSOFT.JET.OLEDB.4.0','dBase III;HDR=NO;IMEX=2;DATABASE=C:\','select * from [客户资料3.dbf]')--*/--/* FoxPro 数据库select * from openrowset('MSDASQL','Driver=Microsoft Visual FoxPro Driver;SourceType=DBF;SourceDB=c:\','select * from [aa.DBF]')--*//**************导⼊DBF⽂件****************/select * from openrowset('MSDASQL','Driver=Microsoft Visual FoxPro Driver;SourceDB=e:\VFP98\data;SourceType=DBF','select * from customer where country != "USA" order by country')go/***************** 导出到DBF ***************/如果要导出数据到已经⽣成结构(即现存的)FOXPRO表中,可以直接⽤下⾯的SQL语句insert into openrowset('MSDASQL','Driver=Microsoft Visual FoxPro Driver;SourceType=DBF;SourceDB=c:\','select * from [aa.DBF]')select * from 表说明:SourceDB=c:\ 指定foxpro表所在的⽂件夹aa.DBF 指定foxpro表的⽂件名./*************导出到Access********************/insert into openrowset('Microsoft.Jet.OLEDB.4.0','x:\A.mdb';'admin';'',A表) select * from 数据库名..B表/*************导⼊Access********************/insert into B表 selet * from openrowset('Microsoft.Jet.OLEDB.4.0','x:\A.mdb';'admin';'',A表)⽂件名为参数declare @fname varchar(20)set @fname = 'd:\test.mdb'exec('SELECT a.* FROM opendatasource(''Microsoft.Jet.OLEDB.4.0'','''+@fname+''';''admin'';'''', topics) as a ')SELECT *FROM OpenDataSource( 'Microsoft.Jet.OLEDB.4.0','Data Source="f:\northwind.mdb";Jet OLEDB:Database Password=123;User ID=Admin;Password=;')...产品********************* 导⼊ xml ⽂件DECLARE @idoc intDECLARE @doc varchar(1000)--sample XML documentSET @doc ='<root><Customer cid= "C1" name="Janine" city="Issaquah"><Order oid="O1" date="1/20/1996" amount="3.5" /><Order oid="O2" date="4/30/1997" amount="13.4">Customer was very satisfied</Order></Customer><Customer cid="C2" name="Ursula" city="Oelde" ><Order oid="O3" date="7/14/1999" amount="100" note="Wrap it bluewhite red"><Urgency>Important</Urgency>Happy Customer.</Order><Order oid="O4" date="1/20/1996" amount="10000"/></Customer></root>'-- Create an internal representation of the XML document.EXEC sp_xml_preparedocument @idoc OUTPUT, @doc-- Execute a SELECT statement using OPENXML rowset provider.SELECT *FROM OPENXML (@idoc, '/root/Customer/Order', 1)WITH (oid char(5),amount float,comment ntext 'text()')EXEC sp_xml_removedocument @idoc/**********************Excel导到Txt****************************************/想⽤select * into opendatasource(...) from opendatasource(...)实现将⼀个Excel⽂件内容导⼊到⼀个⽂本⽂件假设Excel中有两列,第⼀列为姓名,第⼆列为很⾏帐号(16位)且银⾏帐号导出到⽂本⽂件后分两部分,前8位和后8位分开。

SQL循环插入批量数据

SQL循环插⼊批量数据declare @i intdeclare @qid intset @i=1set @qid=100while @i<50000begininsert into Order(orderid,ordername) values(@qid,'订单名称')set @i=@i+1set @qid=@qid+1end海量语句查询代码优化:具体要注意的:1.应尽量避免在 where ⼦句中对字段进⾏ null 值判断,否则将导致引擎放弃使⽤索引⽽进⾏全表扫描,如:select id from t where num is null可以在num上设置默认值0,确保表中num列没有null值,然后这样查询:select id from t where num=02.应尽量避免在 where ⼦句中使⽤!=或<>操作符,否则将引擎放弃使⽤索引⽽进⾏全表扫描。

优化器将⽆法通过索引来确定将要命中的⾏数,因此需要搜索该表的所有⾏。

3.应尽量避免在 where ⼦句中使⽤ or 来连接条件,否则将导致引擎放弃使⽤索引⽽进⾏全表扫描,如:select id from t where num=10 or num=20可以这样查询:select id from t where num=10union allselect id from t where num=204.in 和 not in 也要慎⽤,因为IN会使系统⽆法使⽤索引,⽽只能直接搜索表中的数据。

如:select id from t where num in(1,2,3)对于连续的数值,能⽤ between 就不要⽤ in 了:select id from t where num between 1 and 35.尽量避免在索引过的字符数据中,使⽤⾮打头字母搜索。

这也使得引擎⽆法利⽤索引。

见如下例⼦:SELECT * FROM T1 WHERE NAME LIKE ‘%L%’SELECT * FROM T1 WHERE SUBSTING(NAME,2,1)=’L’SELECT * FROM T1 WHERE NAME LIKE ‘L%’即使NAME字段建有索引,前两个查询依然⽆法利⽤索引完成加快操作,引擎不得不对全表所有数据逐条操作来完成任务。

SQLServer数据库中批量导入数据的四种方法

SQLServer数据库中批量导入数据的四种方法在软件项目实施的时候,数据导入一直是项目人员比较头疼的问题。

其实,在SQL Server中集成了很多成批导入数据的方法。

有些项目实施顾问头疼的问题,在我们数据库管理员眼中,是小菜一碟。

现在的重点就是,如何让用户了解这些方法,让数据导入变得轻松一些。

第一:使用Select Into语句若企业数据库都采用的是SQL Server数据库的话,则可以利用Select Into语句来实现数据的导入。

Select Into语句,他的作用就是把数据从另外一个数据库中查询出来,然后加入到某个用户指定的表中。

在使用这条语句的时候,需要注意几个方面的内容。

一、是需要在目的数据库中先建立相关的表。

如想把进销存系统数据库(SQLServer)中的产品信息表(Product)导入到ERP系统中的产品信息表(M_Product)中。

则前期是在ERP系统的数据库中已经建立了这张产品信息表。

二、是这种方法只复制表中的数据,而不复制表中的索引。

如在进销存系统数据中的产品信息表中,在产品编号、产品种类等字段上建立了索引。

则利用Select Into语句把数据复制到ERP系统的表中的时候,只是复制了数据内容的本身,而不会复制索引等信息。

三、是这条语句使用具有局限性。

一般情况下,这只能够在SQL Server数据库中采用。

不过,对于SQL Server不同版本的数据库,如2008或者2003,还都是兼容的。

若需要导入的对象数据库不是SQL Server的,则需要采用其他的方法。

四、是采用这条语句的话,在目的表中必须不存在数据。

否则的话,目的表中的数据会被清除。

也就是说,这个语句不支持表与表数据的合并。

在SQL Server中,有一条类似的语句,可以实现这个功能。

这条语句就是:Insert Into。

他的作用就是把另外一张表中的数据插入到当前表中。

若用户想要的时表与表数据的合并,则可以采用这条语句。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
相关文档
最新文档