微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

SQLSERVER2008表值参数批量更新效率高

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;@H_502_25@ System.Diagnostics;@H_502_25@ System.Data;@H_502_25@ System.Data.sqlClient;@H_502_25@ com.DataAccess;@H_502_25@@H_502_25@ namespace ConsoleAppInsertTest@H_502_25@ {@H_502_25@ class Program@H_502_25@ {@H_502_25@ static string connectionString = sqlHelper.ConnectionStringLocalTransaction; // 数据库连接字符串 @H_502_25@ int count 1000000 ; 插入的条数 void Main( [] args)@H_502_25@ {@H_502_25@ long commonInsertRunTime = CommonInsert();@H_502_25@ Console.WriteLine(string.Format("普通方式插入{1}条数据所用的时间是{0}毫秒",commonInsertRunTime,count)); long sqlBulkcopyInsertRunTime sqlBulkcopyInsert();@H_502_25@ Console.WriteLine( .Format( " 使用sqlBulkcopy插入{1}条数据所用的时间是{0}毫秒 " ,sqlBulkcopyInsertRunTime,count));@H_502_25@@H_502_25@ TVPInsertRunTime TVPInsert();@H_502_25@ Console.WriteLine( 使用表值方式(TVP)插入{1}条数据所用的时间是{0}毫秒 502_25@ }@H_502_25@@H_502_25@ /// <summary> @H_502_25@ 普通调用存储过程插入数据@H_502_25@ </summary> <returns></returns> @H_502_25@ private CommonInsert()@H_502_25@ {@H_502_25@ Stopwatch stopwatch new Stopwatch();@H_502_25@ stopwatch.Start();@H_502_25@@H_502_25@ passportKey;@H_502_25@ for ( i 0 ; i < count; i ++ )@H_502_25@ {@H_502_25@ passportKey Guid.NewGuid().ToString();@H_502_25@ sqlParameter[] sqlParameter { sqlParameter( @passport ssportKey) };@H_502_25@ sqlHelper.ExecuteNonQuery(connectionString,CommandType.StoredProcedure, CreatePassport sqlParameter);@H_502_25@ }@H_502_25@ stopwatch.Stop();@H_502_25@ return stopwatch.ElapsedMilliseconds;@H_502_25@ }@H_502_25@@H_502_25@ 使用sqlBulkcopy方式插入数据@H_502_25@ <param name="dataTable"></param> sqlBulkcopyInsert()@H_502_25@ {@H_502_25@ Stopwatch stopwatch Stopwatch();@H_502_25@ stopwatch.Start();@H_502_25@@H_502_25@ DataTable dataTable GetTableSchema();@H_502_25@ Guid.NewGuid().ToString();@H_502_25@ DaTarow daTarow dataTable.NewRow();@H_502_25@ daTarow[ ] passportKey;@H_502_25@ dataTable.Rows.Add(daTarow);@H_502_25@ }@H_502_25@@H_502_25@ sqlBulkcopy sqlBulkcopy sqlBulkcopy(connectionString);@H_502_25@ sqlBulkcopy.DestinationTableName Passport ;@H_502_25@ sqlBulkcopy.BatchSize dataTable.Rows.Count;@H_502_25@ sqlConnection sqlConnection sqlConnection(connectionString);@H_502_25@ sqlConnection.open();@H_502_25@ if (dataTable != null && dataTable.Rows.Count != )@H_502_25@ {@H_502_25@ sqlBulkcopy.WritetoServer(dataTable);@H_502_25@ }@H_502_25@ sqlBulkcopy.Close();@H_502_25@ sqlConnection.Close();@H_502_25@@H_502_25@ stopwatch.Stop();@H_502_25@ stopwatch.ElapsedMilliseconds;@H_502_25@ }@H_502_25@@H_502_25@ TVPInsert()@H_502_25@ {@H_502_25@ Stopwatch stopwatch passportKey;@H_502_25@ dataTable.Rows.Add(daTarow);@H_502_25@ }@H_502_25@@H_502_25@ sqlParameter[] sqlParameter @TVP 502_25@ sqlHelper.ExecuteNonQuery(connectionString,0)">CreatePassportWithTVP sqlParameter);@H_502_25@@H_502_25@ stopwatch.Stop();@H_502_25@ DataTable GetTableSchema()@H_502_25@ {@H_502_25@ DataTable dataTable DataTable();@H_502_25@ dataTable.Columns.AddRange( DataColumn[] { DataColumn( PassportKey ) });@H_502_25@@H_502_25@ dataTable; } } }

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐