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;
}

}
}