使用表类型(Table Type-SqlServer)实现百万级别的数据一次性毫秒级别插入
使用表类型(table type)实现百万级别的数据一次性插入
思路
1 创建表类型(tabletype)
2 创建添加存储过程
3 使用c#语言构建一个datatable
4 将整个table作为参数插入
步骤1 创建表类型(tabletype)
create type [dbo].[testtabletype] as table(
[seriesnumber] [nvarchar](80) not null,
[customername] [nvarchar](80) not null,
)
步骤2 创建添加存储过程
create procedure [dbo].[usp_add_repeatdataanalysis]
(
@testtabletype testtabletype readonly
)
as
begin
set nocount on
begin transaction
insert into mes_snoriginal
(
seriesnumber,
customername
)
select
seriesnumber
,customername
from @testtabletype
commit transaction
end
步骤3 使用c#语言构建一个datatable
public static void testtabletype()
{
datatable datatable = new datatable();
datatable.columns.add("seriesnumber", typeof(string));
datatable.columns.add("customername", typeof(string));
datarow datarow = datatable.newrow();
datarow["seriesnumber"] = "seriesnumber";
datarow["customername"] = "seriesnumber";
addtesttabletype(datatable);
}
步骤4 将整个table作为参数插入
public static void addtesttabletype(datatable dt)
{
sqlparameter[] parameters = new sqlparameter[1];
parameters[0] = new sqlparameter() { parametername = "testtabletype", value = dt };//值为上面转换的datatable
executestoredprocedure("usp_add_repeatdataanalysis", parameters);
}
public static void executestoredprocedure(string spname, sqlparameter[] parametervalues)
{
//自己配置数据库连接
string connectionstring = "";
list<testtabletypedto> resultlist = new list<testtabletypedto>();
using (sqlconnection conn = new sqlconnection(connectionstring))
{
conn.open();
sqlcommand cmd = new sqlcommand(spname, conn);
cmd.commandtype = commandtype.storedprocedure;
cmd.commandtimeout = 0;
foreach (sqlparameter p in parametervalues)
{
if ((p.direction == parameterdirection.inputoutput) && (p.value == null))
{
p.value = dbnull.value;
}
cmd.parameters.add(p);
}
cmd.executenonquery();
}
}
}
public class testtabletypedto
{
public int mes_snoriginal_uid { get; set; }
public string seriesnumber { get; set; }
}