目前我覺得有兩種方法可以用作批量數據的處理,也算比較靠譜的吧: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)
?
?