亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 數據庫 > SQL Server > 正文

SQLServer 批量插入數據的兩種方法

2024-08-31 00:56:20
字體:
來源:轉載
供稿:網友
運行下面的腳本,建立測試數據庫和表值參數。

復制代碼 代碼如下:


--Create DataBase
create database BulkTestDB;
go
use BulkTestDB;
go
--Create Table
Create table BulkTestTable(
Id int primary key,
UserName nvarchar(32),
Pwd varchar(16))
go
--Create Table Valued
CREATE TYPE BulkUdt AS TABLE
(Id int,
UserName nvarchar(32),
Pwd varchar(16))


下面我們使用最簡單的Insert語句來插入100萬條數據,代碼如下:

復制代碼 代碼如下:


Stopwatch sw = new Stopwatch();

SqlConnection sqlConn = new SqlConnection(
ConfigurationManager.ConnectionStrings["ConnStr"].ConnectionString);//連接數據庫

SqlCommand sqlComm = new SqlCommand();
sqlComm.CommandText = string.Format("insert into BulkTestTable(Id,UserName,Pwd)values(@p0,@p1,@p2)");//參數化SQL
sqlComm.Parameters.Add("@p0", SqlDbType.Int);
sqlComm.Parameters.Add("@p1", SqlDbType.NVarChar);
sqlComm.Parameters.Add("@p2", SqlDbType.VarChar);
sqlComm.CommandType = CommandType.Text;
sqlComm.Connection = sqlConn;
sqlConn.Open();
try
{
//循環插入100萬條數據,每次插入10萬條,插入10次。
for (int multiply = 0; multiply < 10; multiply++)
{
for (int count = multiply * 100000; count < (multiply + 1) * 100000; count++)
{

sqlComm.Parameters["@p0"].Value = count;
sqlComm.Parameters["@p1"].Value = string.Format("User-{0}", count * multiply);
sqlComm.Parameters["@p2"].Value = string.Format("Pwd-{0}", count * multiply);
sw.Start();
sqlComm.ExecuteNonQuery();
sw.Stop();
}
//每插入10萬條數據后,顯示此次插入所用時間
Console.WriteLine(string.Format("Elapsed Time is {0} Milliseconds", sw.ElapsedMilliseconds));
}
}
catch (Exception ex)
{
throw ex;
}
finally
{
sqlConn.Close();
}

Console.ReadLine();


耗時圖如下:

SQLServer 批量插入數據的兩種方法

由于運行過慢,才插入10萬條就耗時72390 milliseconds,所以我就手動強行停止了。

下面看一下使用Bulk插入的情況:

bulk方法主要思想是通過在客戶端把數據都緩存在Table中,然后利用SqlBulkCopy一次性把Table中的數據插入到數據庫

代碼如下:

復制代碼 代碼如下:


public static void BulkToDB(DataTable dt)
{
SqlConnection sqlConn = new SqlConnection(
ConfigurationManager.ConnectionStrings["ConnStr"].ConnectionString);
SqlBulkCopy bulkCopy = new SqlBulkCopy(sqlConn);
bulkCopy.DestinationTableName = "BulkTestTable";
bulkCopy.BatchSize = dt.Rows.Count;

try
{
sqlConn.Open();
if (dt != null && dt.Rows.Count != 0)
bulkCopy.WriteToServer(dt);
}
catch (Exception ex)
{
throw ex;
}
finally
{
sqlConn.Close();
if (bulkCopy != null)
bulkCopy.Close();
}
}

public static DataTable GetTableSchema()
{
DataTable dt = new DataTable();
dt.Columns.AddRange(new DataColumn[]{
new DataColumn("Id",typeof(int)),
new DataColumn("UserName",typeof(string)),
new DataColumn("Pwd",typeof(string))});

return dt;
}

static void Main(string[] args)
{
Stopwatch sw = new Stopwatch();
for (int multiply = 0; multiply < 10; multiply++)
{
DataTable dt = Bulk.GetTableSchema();
for (int count = multiply * 100000; count < (multiply + 1) * 100000; count++)
{
DataRow r = dt.NewRow();
r[0] = count;
r[1] = string.Format("User-{0}", count * multiply);
r[2] = string.Format("Pwd-{0}", count * multiply);
dt.Rows.Add(r);
}
sw.Start();
Bulk.BulkToDB(dt);
sw.Stop();
Console.WriteLine(string.Format("Elapsed Time is {0} Milliseconds", sw.ElapsedMilliseconds));
}

Console.ReadLine();
}


耗時圖如下:

SQLServer 批量插入數據的兩種方法



可見,使用Bulk后,效率和性能明顯上升。使用Insert插入10萬數據耗時72390,而現在使用Bulk插入100萬數據才耗時17583。

最后再看看使用表值參數的效率,會另你大為驚訝的。

表值參數是SQL Server 2008新特性,簡稱TVPs。對于表值參數不熟悉的朋友,可以參考最新的book online,我也會另外寫一篇關于表值參數的博客,不過此次不對表值參數的概念做過多的介紹。言歸正傳,看代碼:

復制代碼 代碼如下:


public static void TableValuedToDB(DataTable dt)
{
SqlConnection sqlConn = new SqlConnection(
ConfigurationManager.ConnectionStrings["ConnStr"].ConnectionString);
const string TSqlStatement =
"insert into BulkTestTable (Id,UserName,Pwd)" +
" SELECT nc.Id, nc.UserName,nc.Pwd" +
" FROM @NewBulkTestTvp AS nc";
SqlCommand cmd = new SqlCommand(TSqlStatement, sqlConn);
SqlParameter catParam = cmd.Parameters.AddWithValue("@NewBulkTestTvp", dt);
catParam.SqlDbType = SqlDbType.Structured;
//表值參數的名字叫BulkUdt,在上面的建立測試環境的SQL中有。
catParam.TypeName = "dbo.BulkUdt";
try
{
sqlConn.Open();
if (dt != null && dt.Rows.Count != 0)
{
cmd.ExecuteNonQuery();
}
}
catch (Exception ex)
{
throw ex;
}
finally
{
sqlConn.Close();
}
}

public static DataTable GetTableSchema()
{
DataTable dt = new DataTable();
dt.Columns.AddRange(new DataColumn[]{
new DataColumn("Id",typeof(int)),
new DataColumn("UserName",typeof(string)),
new DataColumn("Pwd",typeof(string))});

return dt;
}

static void Main(string[] args)
{
Stopwatch sw = new Stopwatch();
for (int multiply = 0; multiply < 10; multiply++)
{
DataTable dt = TableValued.GetTableSchema();
for (int count = multiply * 100000; count < (multiply + 1) * 100000; count++)
{
DataRow r = dt.NewRow();
r[0] = count;
r[1] = string.Format("User-{0}", count * multiply);
r[2] = string.Format("Pwd-{0}", count * multiply);
dt.Rows.Add(r);
}
sw.Start();
TableValued.TableValuedToDB(dt);
sw.Stop();
Console.WriteLine(string.Format("Elapsed Time is {0} Milliseconds", sw.ElapsedMilliseconds));
}

Console.ReadLine();
}


耗時圖如下:

SQLServer 批量插入數據的兩種方法

比Bulk還快5秒。
此文原創自CSDN TJVictor

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲国产中文字幕在线观看| 91久久国产综合久久91精品网站| 亚洲欧美日韩国产中文| 日韩美女视频免费在线观看| 国产丝袜精品第一页| 亚洲人午夜精品免费| 狠狠综合久久av一区二区小说| 3344国产精品免费看| 久久91亚洲精品中文字幕| 在线精品高清中文字幕| 亚洲精品电影网站| 色偷偷噜噜噜亚洲男人的天堂| 国产精品2018| 欧美成人精品一区二区| 久久中文字幕在线视频| 色婷婷av一区二区三区在线观看| 国产精品尤物福利片在线观看| 久久久久亚洲精品成人网小说| 亚洲成人中文字幕| 亚洲国产精品专区久久| …久久精品99久久香蕉国产| 久久久久久久一区二区| 欧美极品美女视频网站在线观看免费| 国产精品v日韩精品| 欧美午夜激情在线| 91精品视频大全| 成人做爰www免费看视频网站| 亚洲天堂第一页| 亚洲第一页在线| 97成人精品区在线播放| 日韩少妇与小伙激情| 欧美电影在线观看| 日本在线观看天堂男亚洲| 国产伦精品免费视频| 国内精品久久久久久久| 精品久久久国产精品999| 欧美日韩在线视频首页| 欧美成人自拍视频| 91国产视频在线播放| 日韩精品视频在线| 国产成人久久久精品一区| 在线播放国产一区中文字幕剧情欧美| 欧美在线视频在线播放完整版免费观看| 日韩成人在线视频观看| 国产香蕉97碰碰久久人人| 日韩av片电影专区| 亚洲国产欧美精品| 欧美综合在线观看| 亚洲黄页视频免费观看| 亚洲自拍偷拍第一页| 91夜夜未满十八勿入爽爽影院| 欧美中文字幕在线| 97久久精品在线| 亚洲国产精久久久久久久| 中文国产亚洲喷潮| 亚洲欧美日韩精品久久亚洲区| 国产精品美女午夜av| 91麻豆桃色免费看| 亚洲人精选亚洲人成在线| 91福利视频在线观看| 欧美日韩一区二区精品| 一区二区三区www| 亚洲人成在线观看| 国产一区二区免费| 日韩在线欧美在线| 国产手机视频精品| 亚洲在线第一页| 亚洲国产毛片完整版| 久久久久中文字幕2018| 日韩一区二区三区xxxx| 久久精品国产成人精品| 成人午夜在线观看| 亚洲欧美三级在线| 2025国产精品视频| 韩国19禁主播vip福利视频| 91在线直播亚洲| 国产成人精品久久亚洲高清不卡| xxxx性欧美| 91大神福利视频在线| 欧美极品美女电影一区| 久久久久久久网站| 色偷偷偷亚洲综合网另类| 日韩av黄色在线观看| 黑人巨大精品欧美一区二区| 久久国产精品久久久| 亚洲欧美日韩国产中文专区| 亚洲精品视频播放| 亚州国产精品久久久| 欧美成人免费全部观看天天性色| 4388成人网| 2019av中文字幕| 97热精品视频官网| 久久99久久久久久久噜噜| 97av在线影院| 日韩av免费在线播放| 国产亚洲激情视频在线| 亚洲人成亚洲人成在线观看| 亚洲免费人成在线视频观看| 精品久久久久久久久久久久| 欧美日韩国产va另类| 久久久久久噜噜噜久久久精品| 欧美激情免费看| 2019中文字幕全在线观看| 在线观看免费高清视频97| 亚洲色图校园春色| 最新日韩中文字幕| 欧美在线日韩在线| 欧美xxxx18性欧美| 国产亚洲精品久久久久久牛牛| 成人a视频在线观看| 92版电视剧仙鹤神针在线观看| 亚洲精品在线视频| 日韩毛片中文字幕| 精品国偷自产在线视频99| 在线观看精品国产视频| 国产午夜精品久久久| 亚洲欧美福利视频| 伊人一区二区三区久久精品| 国产精品自拍偷拍| 久久久999国产精品| 91精品久久久久久久久久入口| 国产91免费观看| 久久人人97超碰精品888| 成人精品视频在线| 伊人久久久久久久久久| 日韩在线观看免费全| 国产日韩av高清| 日韩av综合中文字幕| 亚洲一级片在线看| 97色在线观看免费视频| 国产精品久久久久久久久| 91啪国产在线| 91sao在线观看国产| 亚洲mm色国产网站| 欧美大片va欧美在线播放| 美女黄色丝袜一区| 色综合久久精品亚洲国产| 97色在线观看| 自拍偷拍亚洲区| 国内精品久久久久久中文字幕| 精品视频久久久久久久| 韩曰欧美视频免费观看| 懂色aⅴ精品一区二区三区蜜月| 日韩在线观看网站| 亚洲精品久久久久| 色噜噜狠狠狠综合曰曰曰88av| 成人免费看吃奶视频网站| 亚洲精品色婷婷福利天堂| 97香蕉超级碰碰久久免费软件| 一区二区成人av| 欧美性xxxxxx| 欧美一区二粉嫩精品国产一线天| 亚洲人成电影网站色xx| 国产精品久久久久久久久| 亚洲最大中文字幕| 国产日韩欧美91| 久久影视电视剧免费网站| 久久久精品一区二区| 久久久久99精品久久久久| 日韩av理论片| 欧美激情欧美激情在线五月| 亚洲欧洲成视频免费观看| 亚洲黄色成人网| 中文字幕精品视频|