欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

使用表类型(Table Type-SqlServer)实现百万级别的数据一次性毫秒级别插入

程序员文章站 2023-11-02 12:16:52
表类型(Table Type)实现百万级别的数据一次性毫秒级别插入 ......

使用表类型(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; }

}