SQLServer2008表值参数(Table-Valued Parameter)批量更新数据。表值参数是SQLServer2008才有的一个新特性,使用这个新特性,我们可以把一个表类型作为参数传递到函数或存储过程里。
1目标要更新的表 DestTableName;
2创建一个自定义类型表,表结构与目标表结构一样 typeTableName;
3创建一个存储过程
A)声明一个自定义类型表参数 @typeTableName typeTableName readonly;
B)insert into DestTableName(Field1,Field2,...) select Field1,Field2,.. from @typeTableName
示例程序实现:
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;
}
}
}
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;
}
}
}
转载于:https://blog.51cto.com/xfsun/972777