SQL Bulk Insert 快速插入

SQL INSERT INTO 语句

INSERT INTO 语句用于向表中插入新记录。

SQL INSERT INTO 语法

INSERT INTO 语句可以有两种编写形式。

① 第一种形式无需指定要插入数据的列名,只需提供被插入的值即可:

INSERT INTO table_nameVALUES (value1,value2,value3,...);

② 第二种形式需要指定列名及被插入的值:

INSERT INTO table_name (column1,column2,column3,...)VALUES (value1,value2,value3,...);

BULK INSERT 语句

BULK INSERT 用于海量数据插入

BULK INSERT 语法

BULK INSERT  [ database_name . [ schema_name ] . | schema_name . ] [ table_name | view_name ]  FROM ‘data_file‘  [ WITH  (  [ [ , ] BATCHSIZE = batch_size ] --BATCHSIZE指令来设置在单个事务中可以插入到表中的记录的数量  [ [ , ] CHECK_CONSTRAINTS ] --指定在大容量导入操作期间,必须检查所有对目标表或视图的约束。若没有 CHECK_CONSTRAINTS 选项,则所有 CHECK 和 FOREIGN KEY 约束都将被忽略,并且在此操作之后表的约束将标记为不可信。  [ [ , ] CODEPAGE = { ‘ACP‘ | ‘OEM‘ | ‘RAW‘ | ‘code_page‘ } ] --指定该数据文件中数据的代码页  [ [ , ] DATAFILETYPE =  { ‘char‘ | ‘native‘| ‘widechar‘ | ‘widenative‘ } ] --指定 BULK INSERT 使用指定的数据文件类型值执行导入操作。  [ [ , ] FIELDTERMINATOR = ‘field_terminator‘ ] --标识分隔内容的符号  [ [ , ] FIRSTROW = first_row ] --指定要加载的第一行的行号。默认值是指定数据文件中的第一行  [ [ , ] FIRE_TRIGGERS ] --是否启动触发器  [ [ , ] FORMATFILE = ‘format_file_path‘ ]  [ [ , ] KEEPIDENTITY ] --指定导入数据文件中的标识值用于标识列  [ [ , ] KEEPNULLS ] --指定在大容量导入操作期间空列应保留一个空值,而不插入用于列的任何默认值  [ [ , ] KILOBYTES_PER_BATCH = kilobytes_per_batch ]  [ [ , ] LASTROW = last_row ] --指定要加载的最后一行的行号  [ [ , ] MAXERRORS = max_errors ] --指定允许在数据中出现的最多语法错误数,超过该数量后将取消大容量导入操作。  [ [ , ] ORDER ( { column [ ASC | DESC ] } [ ,...n ] ) ] --指定数据文件中的数据如何排序  [ [ , ] ROWS_PER_BATCH = rows_per_batch ]  [ [ , ] ROWTERMINATOR = ‘row_terminator‘ ] --标识分隔行的符号  [ [ , ] TABLOCK ] --指定为大容量导入操作持续时间获取一个表级锁  [ [ , ] ERRORFILE = ‘file_name‘ ] --指定用于收集格式有误且不能转换为 OLE DB 行集的行的文件。  )]

简单示例

为了对比BULK INSERT和普通逐条插入的差异,我们通过一个简单的示例,通过实际运行来查看效果。

第一步:在数据库新建两张一样的表,分表为Student和Student1,表结构完全相同,只有ID,NAME,AGE三个简单的字段。

第二步:新建一个控制台程序,通过一个简单的循环,生成500000条数据写入到txt文件中,关键代码如下:

/// <summary>/// 生成测试数据/// </summary>private static void GenerateTestData(){ string fileName = "sql"; int i = 1; while (i <= 500000) { string strInsert = string.Format("{0},‘test{0}‘,{0}|", i); File.AppendText(strInsert, fileName); i++; }}

第三步:封装出两个方法,分别用来执行批量插入和普通插入,具体代码如下:

 /// <summary> /// 批量插入测试 /// </summary> private static void BulkInsertTest() { string strFilePath = @"D:\学习\ASP.NET\QYH.BlukInsertTest\sql.txt"; string strTableName = "Student";

 /* 每一个字段的信息以“,”分割  *每一条数据以“|”符号分隔 * 每10万条数据一个事务*/ string sql = string.Format("BULK INSERT {0} FROM ‘{1}‘ WITH (FIELDTERMINATOR = ‘,‘,ROWTERMINATOR =‘|‘,BATCHSIZE = 50000)", strTableName, strFilePath); DBHelper dbHelper = new DBHelper(); dbHelper.Excute(sql);

 }

 /// <summary> /// 普通插入测试 /// </summary> private static void CommonInsertTest() { int i = 1; while (i <= 500000) { string sqlInsert = string.Format("insert into Student1(id,Name,Age) values({0},‘test{0}‘,{0})", i); new DBHelper().Excute(sqlInsert); i++; } }

第四步:Main主函数中调用批量插入和普通插入方法,并通过Stopwatch计算出执行时间,Pragram完整代码如下:

using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;using QYH.BlukInsertTest.FileMange;using QYH.BlukInsertTest.DataBase;using System.Diagnostics;

namespace QYH.BlukInsertTest{ class Program { static void Main(string[] args) { //用于生成海量数据 //GenerateTestData();

 Stopwatch stopwatch = Stopwatch.StartNew(); try { BulkInsertTest(); } catch (Exception) {

 //throw; }

 stopwatch.Stop(); string strResult = "批量插入耗时:" + stopwatch.ElapsedMilliseconds.ToString();

 Stopwatch stopwatch1 = Stopwatch.StartNew(); CommonInsertTest(); stopwatch1.Stop(); string str1Result = "普通插入耗时:" + stopwatch1.ElapsedMilliseconds.ToString();

 string strTestResult = "result"; File.WriteTextAsync(strResult + "\r\n" + str1Result, strTestResult);

 //Console.Read(); }

 /// <summary> /// 批量插入测试 /// </summary> private static void BulkInsertTest() { string strFilePath = @"D:\学习\ASP.NET\QYH.BlukInsertTest\sql.txt"; string strTableName = "Student";

 /* 每一个字段的信息以“,”分割  *每一条数据以“|”符号分隔 * 每10万条数据一个事务*/ string sql = string.Format("BULK INSERT {0} FROM ‘{1}‘ WITH (FIELDTERMINATOR = ‘,‘,ROWTERMINATOR =‘|‘,BATCHSIZE = 50000)", strTableName, strFilePath); DBHelper dbHelper = new DBHelper(); dbHelper.Excute(sql);

 }

 /// <summary> /// 普通插入测试 /// </summary> private static void CommonInsertTest() { int i = 1; while (i <= 500000) { string sqlInsert = string.Format("insert into Student1(id,Name,Age) values({0},‘test{0}‘,{0})", i); new DBHelper().Excute(sqlInsert); i++; } }

 /// <summary> /// 生成测试数据 /// </summary> private static void GenerateTestData() { string fileName = "sql";

 int i = 1; while (i <= 500000) { string strInsert = string.Format("{0},‘test{0}‘,{0}|", i); File.AppendText(strInsert, fileName); i++; } } }}

示例中还用到两个辅助类,DBHelper.cs和File.cs,由于仅用于演示,所以写的非常简单,其中文件路径是写死的,可以替换成实际路径。

DBHelper.cs

using System;using System.Collections.Generic;using System.Data.SqlClient;using System.Linq;using System.Text;using System.Threading.Tasks;

namespace QYH.BlukInsertTest.DataBase{ public class DBHelper { public string connectionString = "Server=.;Database=QYHDB;User ID=sa;Password=123456;Trusted_Connection=False;";

 public void Excute(string sql) { SqlConnection conn = new SqlConnection(connectionString); SqlCommand command = new SqlCommand(); command.CommandTimeout = 0; command.Connection = conn; command.CommandText = sql; conn.Open(); command.ExecuteNonQuery(); conn.Close(); } }}

File.cs

using System;using System.Collections.Generic;using System.IO;using System.Linq;using System.Text;using System.Threading.Tasks;

namespace QYH.BlukInsertTest.FileMange{ public class File { public static string strFilePath = @"D:\学习\ASP.NET\QYH.BlukInsertTest";

 public static async void WriteTextAsync(string text, string fileName) { using (StreamWriter outputFile = new StreamWriter(strFilePath + @"\" + fileName + ".txt")) { await outputFile.WriteAsync(text); } }

 public static void AppendText(string text, string fileName) { // Append text to an existing file named "WriteLines.txt". using (StreamWriter outputFile = new StreamWriter(strFilePath + @"\" + fileName + ".txt",true)) { outputFile.WriteLine(text); } } }}

一切准备就绪,开始运行,结果如下:

其中单位为毫秒,从结果我们可以看出BULK INSER插入500000条数据还不需要3秒,而普通逐条插入却需要20多分钟

原文地址:https://www.cnblogs.com/twelvezuo/p/11671205.html

时间: 2024-10-11 09:45:39

SQL Bulk Insert 快速插入的相关文章

sql bulk insert

create table test (id int IDENTITY, amount int check(amount >=1000 and amount<=5000)); SELECT * FROM dbo.test /* 下面这个语句不检查约束: */ SET IDENTITY_INSERT dbo.test OFF bulk insert dbo.test from 'f:\test.txt' with (fieldterminator=',', rowterminator='\n')

Sql server bulk insert文本文件插入到数据库

Bulk Insert Sql server 的bulk insert语句可以高效的导入大数据量的平面文件(txt,csv文件)到数据库的一张表中,其用法如下: bulk insert test from 'f:\test.txt' with (fieldterminator=',', rowterminator='\n') 其中"test"是数据库表的名字,"f:\test.txt"是导入平面文件的地址,fieldterminator指定平面文件中列的分隔符是什么

C# .NET - Sql Bulk Insert from multiple delimited Textfile using c#.net

SqlBulkCopy.WriteToServer has 4 overloads:SqlBulkCopy.WriteToServer (DataRow[])    Copies all rows from the supplied DataRow array to a destination table specified by the     DestinationTableName property of the SqlBulkCopy object. SqlBulkCopy.WriteT

如何通过sql的insert语句插入大量字符串到oracle的clob字段?

当通过insert语句直接插入大量字符串(主要是html的内容),超过4000字符时候,就会报: ORA-01489: 字符串连接的结果过长 虽然字段是clob,足以存储,但是通过这种直接插入的时候,因为没有强制指定带插入字符串为clob类型, oracle会把插入的字符串作为 “字符串类型”处理,由于oracle有最大字符串限制(不超过4000个字符),所以会报错. 解决思路:指定待插入字符串类型为clob,可以使用过程或存储过程 例子: DECLARE REALLYBIGTEXTSTRING

SQL SERVER 使用BULK Insert将txt文件中的数据批量插入表中(1)

1/首先建立数据表 CREATE TABLE BasicMsg( RecvTime FLOAT NOT NULL , --接收时间,不存在时间相同的数据 AA INT NOT NULL, --24位地址码 . FlightID Varchar(10) NULL, --航班号) 2/ 建立存储过程 USE DF17DataProIF EXISTS (SELECT * FROM SYS.PROCEDURES WHERE OBJECT_ID = OBJECT_ID(N'[DBO].[BulkDataP

Bulk Insert 高效快速插入数据

BULK INSERT以用户指定的格式复制一个数据文件至数据库表或视图中. 语法: 1 BULK INSERT [ [ 'database_name'.][ 'owner' ].]{ 'table_name' FROM 'data_file' } 2 WITH ( 3 [ BATCHSIZE [ = batch_size ] ], 4 [ CHECK_CONSTRAINTS ], 5 [ CODEPAGE [ = 'ACP' | 'OEM' | 'RAW' | 'code_page' ] ],

SSIS常用的包—大量插入任务(Bulk Insert task)

大量插入任务允许像 BULK INSERT 语句或者bcp.exe 命令行工具一样 从 txt文件(也叫做平面文件)中插入数据.这个 task工具箱中的 Control Flow Items中,它不会产生数据流.这种 task的一个缺点是在插入的时候不允许任何形式的数据转换.同时,它可以以最快的速度向 SQL Server中写入大量的数据,不论数据量是的是小. 创建一个大量插入任务,然后设置它的属性,打开编辑页面(图 3-2).像大多数 task一样编辑页面可以命名,描述这个 task.注意命名

BULK INSERT如何将大量数据高效地导入SQL Server

转载自:http://database.51cto.com/art/201108/282631.htm BULK INSERT如何将大量数据高效地导入SQL Server 本文我们详细介绍了BULK INSERT将大量数据高效地导入SQL Server数据库的方法,希望本次的介绍能够对您有所帮助. AD:WOT2014课程推荐:实战MSA:用开源软件搭建微服务系统 在实际的工作需要中,我们有时候需将大量的数据导入到数据库中.这时候我们不得不考虑的就是效率问题.本文我们就介绍了一种将大量数据高效地

SQL Server 2012中快速插入批量数据的示例及疑惑

SQL Server 2008中SQL应用系列--目录索引 今天在做一个案例演示时,在SQL Server 2012中使用Insert语句插入1万条数据,结果遇到了一个奇怪的现象,现将过程分享出来,以供有兴趣的同学参考. 附:我的测试环境为:SQL Server 2012,命名实例 Microsoft SQL Server 2012 - 11.0.2100.60 (Intel X86) Feb 10 2012 19:13:17 Copyright (c) Microsoft Corporatio