SQLSERVER2008表值参数批量更新效率高
发布时间:2020-12-12 14:29:45 所属栏目:MsSql教程 来源:网络整理
导读:SQLServer2008表值参数(Table-Valued Parameter)批量更新数据。表值参数是SQLServer2008才有的一个新特性,使用这个新特性,我们可以把一个表类型作为参数传递到函数或存储过程里。 1目标要更新的表 DestTableName; 2创建一个自定义类型表,表结构与目标
SQLServer2008表值参数(Table-Valued Parameter)批量更新数据。表值参数是SQLServer2008才有的一个新特性,使用这个新特性,我们可以把一个表类型作为参数传递到函数或存储过程里。
1目标要更新的表 DestTableName;
2创建一个自定义类型表,表结构与目标表结构一样 typeTableName;
3创建一个存储过程
A)声明一个自定义类型表参数 @typeTableName typeTableName?readonly;
?B)insert into?DestTableName(Field1,Field2,...) select?Field1,..?from @typeTableName
示例程序实现:
using
System; System.Diagnostics; System.Data; System.Data.SqlClient; com.DataAccess; namespace ConsoleAppInsertTest { class Program { static string connectionString = SqlHelper.ConnectionStringLocalTransaction; // 数据库连接字符串 int count 1000000 ; 插入的条数 void Main( [] args) { long commonInsertRunTime = CommonInsert(); Console.WriteLine(string.Format("普通方式插入{1}条数据所用的时间是{0}毫秒",commonInsertRunTime,count)); long sqlBulkCopyInsertRunTime SqlBulkCopyInsert(); Console.WriteLine( .Format( " 使用SqlBulkCopy插入{1}条数据所用的时间是{0}毫秒 " ,sqlBulkCopyInsertRunTime,count)); TVPInsertRunTime TVPInsert(); Console.WriteLine( 使用表值方式(TVP)插入{1}条数据所用的时间是{0}毫秒 /// <summary> 普通调用存储过程插入数据 </summary> <returns></returns> private CommonInsert() { Stopwatch stopwatch new Stopwatch(); stopwatch.Start(); passportKey; for ( i 0 ; i < count; i ++ ) { passportKey Guid.NewGuid().ToString(); SqlParameter[] sqlParameter { SqlParameter( @passport CreatePassport return stopwatch.ElapsedMilliseconds; } 使用SqlBulkCopy方式插入数据 <param name="dataTable"></param> SqlBulkCopyInsert() { Stopwatch stopwatch Stopwatch(); stopwatch.Start(); DataTable dataTable GetTableSchema(); Guid.NewGuid().ToString(); DataRow dataRow dataTable.NewRow(); dataRow[ ] passportKey; dataTable.Rows.Add(dataRow); } SqlBulkCopy sqlBulkCopy SqlBulkCopy(connectionString); sqlBulkCopy.DestinationTableName Passport ; sqlBulkCopy.BatchSize dataTable.Rows.Count; SqlConnection sqlConnection SqlConnection(connectionString); sqlConnection.Open(); if (dataTable != null && dataTable.Rows.Count != ) { sqlBulkCopy.WriteToServer(dataTable); } sqlBulkCopy.Close(); sqlConnection.Close(); stopwatch.Stop(); stopwatch.ElapsedMilliseconds; } TVPInsert() { Stopwatch stopwatch passportKey; dataTable.Rows.Add(dataRow); } SqlParameter[] sqlParameter @TVP CreatePassportWithTVP DataTable GetTableSchema() { DataTable dataTable DataTable(); dataTable.Columns.AddRange( DataColumn[] { DataColumn( PassportKey ) }); dataTable; } } } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |