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

重复批量上传数据处理

程序员文章站 2022-04-12 15:32:46
在本篇中,学习与练习SQL知识,程序中提供用户批量上传数据。在上传时也许会有网络中断,上传一部分,再重新上传。这样会有数据重复。 或者是需要对原有数据进行批量修改,删除等,要如何进行。 下面Insus.NET举个简单的例子。 先是在数据库创建一张表,是用来存储用户上传的数据。 CREATE TABL ......

在本篇中,学习与练习sql知识,程序中提供用户批量上传数据。在上传时也许会有网络中断,上传一部分,再重新上传。这样会有数据重复。

或者是需要对原有数据进行批量修改,删除等,要如何进行。

下面insus.net举个简单的例子。

先是在数据库创建一张表,是用来存储用户上传的数据。

 

create table [dbo].[network_register]
(
    [id] int not null,
    [name] nvarchar(20) null,
    [mac] varchar(17) null,
    [ipv4] varchar(15) null
)

 

直接在数据库添加几笔记录作为原始数据。

 

insert into [dbo].[network_register] ([id],[name],[mac],[ipv4])
values 
(11,'','48-a3-80-78-cc-ec',''),
(12,'','44-c3-46-e0-ca-6d',''),
(16,'','30-84-54-9d-18-2f',''),
(17,'','84-9f-b5-a7-ef-65',''),
(20,'','88-36-5f-b4-55-3d','')

select [id],[name],[mac],[ipv4] from  [dbo].[network_register]

 

既然是批量上传,使用表类型作为存储过程的参数,先创建一个表类型,这个表类型跟上面的数据表的结构一样:

 

create type [dbo].[udtt_networkregister] as table
(   
    [id] int null,
    [name] nvarchar(20) null,
    [mac] varchar(17) null,
    [ipv4] varchar(15) null
)
go

 

接下来,是创建一个存储过程:

 

create procedure [dbo].[usp_network_register_blukinsert] (
    @bulk_data [dbo].[udtt_networkregister] readonly
)
as
begin
    merge [dbo].[network_register] as target
    using (select [id],[name],[mac],[ipv4] from @bulk_data) as source
    on (target.[id] = source.[id])
 
    when matched then
        update set target.[name] = source.[name],target.[mac] = source.[mac],target.[ipv4] = source.[ipv4]
 
    when not matched by target then
        insert ([id],[name],[mac],[ipv4]) values ([id],[name],[mac],[ipv4]);  
end
go

 

存储过程的主体,使用了merge的功能,判断上传的数据与原有数据进行按条件匹对。

相同matched的更新,不相同not matched的添加。

 

下面的数据是新上传的数据,高亮的id是数据库表已经存在的数据:

 

declare @network_data as [dbo].[udtt_networkregister]
 
insert into @network_data
select [id],[name],[mac],[ipv4] from (
values
(11,'it00003','48-a3-80-78-cc-ec','10.0.0.33'),
(12,'','44-c3-46-e0-ca-6d','192.168.3.22'),
(13,'it06531','ec-01-ee-2e-92-be','127.0.0.1'),
(14,'','e4-46-da-e8-0f-31',''),
(15,'it45311','60-91-f3-a7-3e-4b',''),
(16,'it43420','30-84-54-9d-18-2f','192.168.0.55'),
(17,'it67543','84-9f-b5-a7-ef-65',''),
(18,'','20-5d-47-81-64-fe','10.0.2.78'),
(19,'it43457','88-28-b3-6a-e9-36','10.6.0.43'),
(20,'it76738','88-36-5f-b4-55-3d','')

) as t([id],[name],[mac],[ipv4])


execute [dbo].[usp_network_register_blukinsert] @network_data
go

 

现在我们再次select查询数据,得到的数据如下: