SqlServer海量数据插⼊(BULKINSERT 执⾏数据⽂件)BULK INSERT 语法
参数说明
  database_name
  指定的表或视图所在的数据库的名称,如果未指定,则默认为当前数据库。
  schema_name
  表或视图架构的名称。
  table_name
  要将数据⼤容量导⼊其中的表或视图的名称。
  ‘data_file’
  数据⽂件的完整路径,该数据⽂件包含到导⼊到指定表或视图中的数据。使⽤BULK INSERT可以从磁盘导⼊数据。
  BATCHSIZE=batch_size
  指定批量处理中的⾏数。每个批处理作为⼀个事物复制到服务器。
  CHECK_CONSTRAINTS
指定在⼤容量导⼊操作期间,必须检查所有对⽬标表或视图的约束。
  FIELDTERMINATOR ='field_terminator'
  指定要⽤于 char 和 widechar 数据⽂件的字段终⽌符,即字段的分隔符。 默认的字段终⽌符是 \t(制表符)。
  ROWTERMINATOR ='row_terminator'
writeline和writelines  指定要⽤于 char 和 widechar 数据⽂件的⾏终⽌符,即⾏的分隔符。
  更多参数说明,请参考:
简单⽰例
  为了对⽐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.";
string strTableName = "Student";
/* 每⼀个字段的信息以“,”分割
*每⼀条数据以“|”符号分隔
* 每10万条数据⼀个事务*/
string sql = string.Format("BULK INSERT {0} FROM '{1}' WITH (FIELDTERMINATOR = ',',ROWTER
MINATOR ='|',BATCHSIZE = 50000)", strTableName,            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();
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.";
string strTableName = "Student";
/* 每⼀个字段的信息以“,”分割
*每⼀条数据以“|”符号分隔
* 每10万条数据⼀个事务*/
string sql = string.Format("BULK INSERT {0} FROM '{1}' WITH (FIELDTERMINATOR = ',',ROWTERMINATOR ='|',BATCHSIZE = 50000)", strTableName,            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

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。