共計 3804 個字符,預計需要花費 10 分鐘才能閱讀完成。
SQL 中怎么批量插入數據,很多新手對此不是很清楚,為了幫助大家解決這個難題,下面丸趣 TV 小編將為大家詳細講解,有這方面需求的人可以來學習下,希望你能有所收獲。
1. 創建表。
2. 創建表值參數類型
我們打開查詢分析器,然后在查詢分析器中執行下列代碼:
Create Type PassportTableType as Table(PassportKey nvarchar(50))
執行成功以后,我們打開企業管理器,按順序依次展開下列節點 – 數據庫、展開可編程性、類型、用戶自定義表類型,就可以看到我們創建好的表值類型了如下圖所示:
說明我們創建表值類型成功了。
3. 編寫存儲過程
存儲過程的代碼為:復制代碼 代碼如下:
USE [TestInsert] GO /****** Object: StoredProcedure [dbo].[CreatePassportWithTVP] Script Date: 03/02/2010 00:14:45 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO — ============================================= — Author: Kevin — Create date: 2010-3-1 — Description: 創建通行證 — ============================================= Create PROCEDURE [dbo].[CreatePassportWithTVP] @TVP PassportTableType readonly AS BEGIN SET NOCOUNT ON; Insert into Passport(PassportKey) select PassportKey from @TVP END
可能在查詢分析器中,智能提示會提示表值類型有問題,會出現紅色下劃線(見下圖),不用理會,繼續運行我們的代碼,完成存儲過程的創建
4. 編寫代碼調用存儲過程。三種數據庫的插入方式代碼如下,由于時間比較緊,代碼可能不那么易讀,特別代碼我加了些注釋。復制代碼 代碼如下:
using System; using System.Diagnostics; using System.Data; using System.Data.SqlClient; using com.DataAccess; namespace ConsoleAppInsertTest {class Program { static string connectionString = SqlHelper.ConnectionStringLocalTransaction; // 數據庫連接字符串 static int count = 1000000; // 插入的條數 static void Main(string[] args) {//long commonInsertRunTime = CommonInsert(); //Console.WriteLine(string.Format( 普通方式插入 {1} 條數據所用的時間是 {0} 毫秒 , commonInsertRunTime, count)); long sqlBulkCopyInsertRunTime = SqlBulkCopyInsert(); Console.WriteLine(string.Format( 使用 SqlBulkCopy 插入 {1} 條數據所用的時間是 {0} 毫秒 , sqlBulkCopyInsertRunTime, count)); long TVPInsertRunTime = TVPInsert(); Console.WriteLine(string.Format( 使用表值方式(TVP)插入 {1} 條數據所用的時間是 {0} 毫秒 , TVPInsertRunTime, count)); } /// summary /// 普通調用存儲過程插入數據 /// /summary /// returns /returns private static long CommonInsert() { Stopwatch stopwatch = new Stopwatch(); stopwatch.Start(); string passportKey; for (int i = 0; i count; i++) {passportKey = Guid.NewGuid().ToString(); SqlParameter[] sqlParameter = {new SqlParameter( @passport , passportKey) }; SqlHelper.ExecuteNonQuery(connectionString, CommandType.StoredProcedure, CreatePassport , sqlParameter); } stopwatch.Stop(); return stopwatch.ElapsedMilliseconds;} /// summary /// 使用 SqlBulkCopy 方式插入數據 /// /summary /// param name= dataTable /param /// returns /returns private static long SqlBulkCopyInsert() { Stopwatch stopwatch = new Stopwatch(); stopwatch.Start(); DataTable dataTable = GetTableSchema(); string passportKey; for (int i = 0; i count; i++) {passportKey = Guid.NewGuid().ToString(); DataRow dataRow = dataTable.NewRow(); dataRow[0] = passportKey; dataTable.Rows.Add(dataRow); } SqlBulkCopy sqlBulkCopy = new SqlBulkCopy(connectionString); sqlBulkCopy.DestinationTableName = Passport sqlBulkCopy.BatchSize = dataTable.Rows.Count; SqlConnection sqlConnection = new SqlConnection(connectionString); sqlConnection.Open(); if (dataTable!=null dataTable.Rows.Count!=0) {sqlBulkCopy.WriteToServer(dataTable); } sqlBulkCopy.Close(); sqlConnection.Close(); stopwatch.Stop(); return stopwatch.ElapsedMilliseconds;} private static long TVPInsert() { Stopwatch stopwatch = new Stopwatch(); stopwatch.Start(); DataTable dataTable = GetTableSchema(); string passportKey; for (int i = 0; i count; i++) {passportKey = Guid.NewGuid().ToString(); DataRow dataRow = dataTable.NewRow(); dataRow[0] = passportKey; dataTable.Rows.Add(dataRow); } SqlParameter[] sqlParameter = { new SqlParameter( @TVP , dataTable) }; SqlHelper.ExecuteNonQuery(connectionString, CommandType.StoredProcedure, CreatePassportWithTVP , sqlParameter); stopwatch.Stop(); return stopwatch.ElapsedMilliseconds;} private static DataTable GetTableSchema() { DataTable dataTable = new DataTable(); dataTable.Columns.AddRange(new DataColumn[] {new DataColumn( PassportKey) }); return dataTable; } } }
比較神秘的代碼其實就下面這兩行,該代碼是將一個 dataTable 做為參數傳給了我們的存儲過程。簡單吧。
SqlParameter[] sqlParameter = { new SqlParameter( @TVP , dataTable) };SqlHelper.ExecuteNonQuery(connectionString, CommandType.StoredProcedure, CreatePassportWithTVP , sqlParameter);
5. 測試并記錄測試結果
第一組測試,插入記錄數 1000
第二組測試,插入記錄數 10000
第三組測試,插入記錄數 1000000
看完上述內容是否對您有幫助呢?如果還想對相關知識有進一步的了解或閱讀更多相關文章,請關注丸趣 TV 行業資訊頻道,感謝您對丸趣 TV 的支持。