C# 使用SqlBulkCopy類批量複製大資料
阿新 • • 發佈:2019-01-30
SqlBulkCopy使用使用用於自定義表型別作為儲存過程引數,批量寫入資料。
如果,大家使用SQL Server 2008,它提供一個新的功能表變數(Table Parameters)可以將整個表資料彙集成一個引數傳遞給儲存過程或SQL語句。它的注意效能開銷是將資料彙集成引數(O(資料量))。
現在,我們修改之前的程式碼,在SQL Server中定義我們的表變數,具體定義如下:
-- =============================================
-- Author: JKhuang
-- Create date: 08/16/2012
-- Description: Declares a user table paramter.
-- =============================================
CREATE TYPE jk_users_bulk_insert AS TABLE (
user_login varchar(60 ),
user_pass varchar(64),
user_nicename varchar(50),
user_email varchar(100),
user_url varchar(100),
user_activation_key varchar(60),
user_status int,
display_name varchar(250)
)
上面,我們定義了一個表引數jk_users_bulk_insert,接著我們定義一個儲存過程接受表引數jk_users_bulk_insert,具體定義如下:
-- =============================================
-- Author: JKhuang
-- Create date: 08 /16/2012
-- Description: Creates a stored procedure, receive
-- a jk_users_bulk_insert argument.
-- =============================================
CREATE PROCEDURE sp_insert_jk_users
@usersTable jk_users_bulk_insert READONLY
AS
INSERT INTO jk_users (user_login, user_pass, user_nicename, user_email, user_url,
user_activation_key, user_status, display_name, user_registered)
SELECT user_login, user_pass, user_nicename, user_email, user_url,
user_activation_key, user_status, display_name, GETDATE()
FROM @usersTable
接下我們在客戶端程式碼中,呼叫儲存過程並且將表作為引數方式傳遞給儲存過程。
var sw = Stopwatch.StartNew();
using (var conn = new SqlConnection(ConfigurationManager.ConnectionStrings["SQLCONN2"].ToString()))
{
conn.Open();
//// Invokes the stored procedure. using (var cmd = new SqlCommand("sp_insert_jk_users", conn))
{
cmd.CommandType = CommandType.StoredProcedure;
//// Adding a "structured" parameter allows you to insert tons of data with low overhead var param = new SqlParameter("@userTable", SqlDbType.Structured) { Value = dt };
cmd.Parameters.Add(param);
cmd.ExecuteNonQuery();
}
}
sw.Stop();
現在,我們重新執行寫入操作發現寫入效率與SqlBulkCopy相當。
如果,大家使用SQL Server 2008,它提供一個新的功能表變數(Table Parameters)可以將整個表資料彙集成一個引數傳遞給儲存過程或SQL語句。它的注意效能開銷是將資料彙集成引數(O(資料量))。
現在,我們修改之前的程式碼,在SQL Server中定義我們的表變數,具體定義如下:
-- =============================================
-- Author: JKhuang
-- Create date: 08/16/2012
-- Description: Declares a user table paramter.
-- =============================================
CREATE TYPE jk_users_bulk_insert AS TABLE (
user_login varchar(60
user_pass varchar(64),
user_nicename varchar(50),
user_email varchar(100),
user_url varchar(100),
user_activation_key varchar(60),
user_status int,
display_name varchar(250)
)
上面,我們定義了一個表引數jk_users_bulk_insert,接著我們定義一個儲存過程接受表引數jk_users_bulk_insert,具體定義如下:
-- =============================================
-- Author: JKhuang
-- Create date: 08
-- Description: Creates a stored procedure, receive
-- a jk_users_bulk_insert argument.
-- =============================================
CREATE PROCEDURE sp_insert_jk_users
@usersTable jk_users_bulk_insert READONLY
AS
INSERT INTO jk_users (user_login, user_pass, user_nicename, user_email, user_url,
user_activation_key, user_status, display_name, user_registered)
SELECT user_login, user_pass, user_nicename, user_email, user_url,
user_activation_key, user_status, display_name, GETDATE()
FROM @usersTable
接下我們在客戶端程式碼中,呼叫儲存過程並且將表作為引數方式傳遞給儲存過程。
var
using (var conn = new SqlConnection(ConfigurationManager.ConnectionStrings["SQLCONN2"].ToString()))
{
conn.Open();
//// Invokes the stored procedure. using (var cmd = new SqlCommand("sp_insert_jk_users", conn))
{
cmd.CommandType = CommandType.StoredProcedure;
//// Adding a "structured" parameter allows you to insert tons of data with low overhead var param = new SqlParameter("@userTable", SqlDbType.Structured) { Value = dt };
cmd.Parameters.Add(param);
cmd.ExecuteNonQuery();
}
}
sw.Stop();
現在,我們重新執行寫入操作發現寫入效率與SqlBulkCopy相當。