目前我觉得有两种方法可以用作批量数据的处理,也算比较靠谱的吧:sqlbulkcopy 和利用表值函数。
1.sqlbulkcopy是dotnet中的一个用来处理大批量插入数据的,具体用法如下:
using (SqlConnection conSave = new SqlConnection(Config.RefStatWriteConnectString))
{
conSave.Open();
//conSave.CommandTimeout = Config.SqlExpireTime;
System.Data.SqlClient.SqlBulkCopy sqlBC = new System.Data.SqlClient.SqlBulkCopy(conSave);
sqlBC.BatchSize = 100000;
//sqlBC.
sqlBC.BulkCopyTimeout = Config.SqlExpireTime;
sqlBC.DestinationTableName = "dbo.weblog";
sqlBC.ColumnMappings.Add("ref", "ref");
sqlBC.ColumnMappings.Add("refcount", "refcount");
sqlBC.ColumnMappings.Add("sourpv", "sourpv");
sqlBC.WriteToServer(weblog);
}
以上只是大略的调用代码。
2.利用表值函数和merge
创建表值函数:
create type typeTest as table (id int)
表值函数作为参数的dotnet调用代码
ParameterName="@OrderRefDetailTable",
TypeName="OrderRefDetailTable",
SqlDbType=SqlDbType.Structured,
Value=(read !=null?(object)read:dtOrderRef)
参数的值可以是 DataTable
, IEnumerable<SqlDataRecord>
, or DbDataReader
利用merge的好处就是效率会高一点,而且不但可以插入数据还可更新数据
merge t
using s on t.id=s.id
when matched then update t.test=s.test
when not matched then insert values(s.id,s.test)