经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 数据库/运维 » MS SQL Server » 查看文章
重复批量上传数据处理
来源:cnblogs  作者:Insus.NET  时间:2019/5/27 8:47:00  对本文有异议

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

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

下面Insus.NET举个简单的例子。

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

 

  1. CREATE TABLE [dbo].[Network_Register]
  2. (
  3. [ID] INT NOT NULL,
  4. [NAME] NVARCHAR(20) NULL,
  5. [MAC] VARCHAR(17) NULL,
  6. [IPv4] VARCHAR(15) NULL
  7. )
Source Code

 

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

 

  1. INSERT INTO [dbo].[Network_Register] ([ID],[NAME],[MAC],[IPv4])
  2. VALUES
  3. (11,'','48-A3-80-78-CC-EC',''),
  4. (12,'','44-C3-46-E0-CA-6D',''),
  5. (16,'','30-84-54-9D-18-2F',''),
  6. (17,'','84-9F-B5-A7-EF-65',''),
  7. (20,'','88-36-5F-B4-55-3D','')
  8. SELECT [ID],[NAME],[MAC],[IPv4] FROM [dbo].[Network_Register]
Source Code

 

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

 

  1. CREATE TYPE [dbo].[udtt_NetworkRegister] AS TABLE
  2. (
  3. [ID] INT NULL,
  4. [NAME] NVARCHAR(20) NULL,
  5. [MAC] VARCHAR(17) NULL,
  6. [IPv4] VARCHAR(15) NULL
  7. )
  8. GO
Source Code

 

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

 

  1. CREATE PROCEDURE [dbo].[usp_Network_Register_BlukInsert] (
  2. @bulk_data [dbo].[udtt_NetworkRegister] READONLY
  3. )
  4. AS
  5. BEGIN
  6. MERGE [dbo].[Network_Register] AS Target
  7. USING (SELECT [ID],[NAME],[MAC],[IPv4] FROM @bulk_data) AS Source
  8. ON (Target.[ID] = Source.[ID])
  9. WHEN MATCHED THEN
  10. UPDATE SET target.[NAME] = source.[NAME],target.[MAC] = source.[MAC],target.[IPv4] = source.[IPv4]
  11. WHEN NOT MATCHED BY TARGET THEN
  12. INSERT ([ID],[NAME],[MAC],[IPv4]) VALUES ([ID],[NAME],[MAC],[IPv4]);
  13. END
  14. GO
Source Code

 

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

相同MATCHED的更新,不相同NOT MATCHED的添加。

 

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

 

  1. DECLARE @network_data AS [dbo].[udtt_NetworkRegister]
  2. INSERT INTO @network_data
  3. SELECT [ID],[NAME],[MAC],[IPv4] FROM (
  4. VALUES
  5. (11,'IT00003','48-A3-80-78-CC-EC','10.0.0.33'),
  6. (12,'','44-C3-46-E0-CA-6D','192.168.3.22'),
  7. (13,'IT06531','EC-01-EE-2E-92-BE','127.0.0.1'),
  8. (14,'','E4-46-DA-E8-0F-31',''),
  9. (15,'IT45311','60-91-F3-A7-3E-4B',''),
  10. (16,'IT43420','30-84-54-9D-18-2F','192.168.0.55'),
  11. (17,'IT67543','84-9F-B5-A7-EF-65',''),
  12. (18,'','20-5D-47-81-64-FE','10.0.2.78'),
  13. (19,'IT43457','88-28-B3-6A-E9-36','10.6.0.43'),
  14. (20,'IT76738','88-36-5F-B4-55-3D','')
  15. ) AS T([ID],[NAME],[MAC],[IPv4])
  16. EXECUTE [dbo].[usp_Network_Register_BlukInsert] @network_data
  17. GO
Source Code

 

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

 

原文链接:http://www.cnblogs.com/insus/p/10922018.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号