MSSQL数据的批量插入
一、概述:
对于数据的批量插入操作似乎成了某些大数据量操作的必用手段,MSSQL也提供了一些数据批量插入的操作方法,先将这些方法汇总,以便于下次用到使用。面对数据的批量插入操作,我们也应该考虑一个问题----数据的完整性。批量的操作有时候并不能保证所有数据的成功操作,那么如何保证数据的完整性那?
二、批量插入的方法:
1、insert into 后面跟数据列表:
INSERT INTO Score VALUES (,),(,),(,) ,(,),(,),(,)
这种操作远比一条条数据的插入效率高好多;
2、Insert into Table2(field1,field2,...) select value1,value2,... from Table1 方式插入:
要求目标表Table2必须存在,由于目标表Table2已经存在,所以我们除了插入源表Table1的字段外,还可以插入常量
insert into Score select stuid,sconum from T2Score
3、SELECT vale1, value2 into Table2 from Table1 ------Table1表不存在是,自动创建
SELECT stuid,scorevalue into Score from NScore
4、使用.Net提供的SqlBulkCopy 类来完成,SqlBulkCopy 可以将数据批量映射到数据库表中;
具体使用方法,就不再举例;
三、批量插入保证数据的完整性
数据批量插入完成,但是怎么保证数据的完整性,SqlBulkCopy 本身就封装了数据一致性,即插入失败的时候,数据回滚,对于其他三种方式,该如何处理,这里就不得不介绍一下事务;
1、 事务是一种机制、是一种操作序列,它包含了一组数据库操作命令,这组命令要么全部执行,要么全部不执行。因此事务是一个不可分割的工作逻辑单元。在数据库系统上执行并发操作时事务是作为最小的控制单元来使用的。
2、事务特点:
事务4大属性:
1> 原子性(Atomicity):事务是一个完整的操作。
2> 一致性(Consistency):当事务完成时,数据必须处于一致状态。
3> 隔离性(Isolation):对数据进行修改的所有并发事务是彼此隔离的。
4> 持久性(Durability):事务完成后,它对于系统的影响是永久性的。
3、事务的操作:
1> SQL Server 2000中,我们一般使用RaiseError来抛出错误交给应用程序来处理;
2> SQL Server 2005集成Try…Catch功能以后,在Catch进行异常捕获,数据回滚;
3> SQL Server 2012,更推出了强大的Throw,处理错误显得更为精简;
4> 对事务XACT_ABORT 解释:
它用于指定当 Transact-SQL 语句出现运行时错误时,SQL Server 是否自动回滚到当前事务。当 SET XACT_ABORT 为 ON 时,如果执行 Transact-SQL 语句产生运行时错误,则整个事务将终止并回滚。当 SET XACT_ABORT 为 OFF 时,有时只回滚产生错误的 Transact-SQL 语句,而事务将继续进行处理。 如果错误很严重,那么即使 SET XACT_ABORT 为 OFF,也可能回滚整个事务。 OFF 是默认设置。编译错误(如语法错误)不受 SET XACT_ABORT 的影响。对于大多数 OLE DB 访问接口(包括 SQL Server),必须将隐式或显示事务中的数据修改语句中的 XACT_ABORT 设置为 ON。 唯一不需要该选项的情况是在提供程序支持嵌套事务时。
5> 大致分为以下四个级别:
A> 当等级SEVERITY为0-10时,为“信息性消息”,最轻。
B> 当等级为11-16时,为“用户可以纠正的数据库引擎错误”。如除数为零,等级为16
C> 当等级为17-19时,为“需要DBA注意的错误”。如内存不足、数据库引擎已到极限等。
D> 当等级为20-25时,为“致命错误或系统问题”。如硬件或软件损坏、完整性问题、媒体故障等。
根据以上解释,我们最保险的方式是:Set XACT_ABORT ON,当然使用Try…Catch在Set XACT_ABORT OFF时也能按照我们的意愿回滚。
下面举例SQL代码:
SET XACT_ABORT OFF
BEGIN TRY
BEGIN TRAN
--INSERT INTO Score VALUES (,)
--INSERT INTO Score VALUES (,)
--INSERT INTO Score VALUES (,)
INSERT INTO Score VALUES (,),(,),(,)
COMMIT TRAN
PRINT '事务提交'
END TRY BEGIN CATCH
ROLLBACK
PRINT '事务回滚' --构造一个错误信息记录
----查询异常数据
SELECT ERROR_NUMBER() AS 错误号,
ERROR_SEVERITY() AS 错误等级,
ERROR_STATE() as 错误状态,
DB_ID() as 数据库ID,
DB_NAME() as 数据库名称,
ERROR_MESSAGE() as 错误信息; --用RAISERROR 抛出异常信息
--SELECT @ErrorMessage = ERROR_MESSAGE(),
--@ErrorSeverity = ERROR_SEVERITY(),
--@ErrorState = ERROR_STATE();
--RAISERROR (@ErrorMessage, -- Message text.
--@ErrorSeverity, -- Severity.
--@ErrorState -- State.
--);
--Throw;
END CATCH
4、注意事项:
1> 利用事务完成的操作,记得一定要是一个完整的事务,即有begin tran 也一定要有commit tran 或者rollback tran来终结该事务;
2> 数据库设计的时候,尽量要使用约束、外键等,当数据操作不合理的时候,才能引发catch捕获,数据才能rollback;
四、结语:
如果不完善的地方,还希望您提出;O(∩_∩)O哈哈~
参考博客地址:
http://www.cnblogs.com/weihengblogs/p/4281148.html
MSSQL数据的批量插入的更多相关文章
- postgresql优化数据的批量插入
原文:http://www.cnblogs.com/mchina/archive/2012/08/11/2537393.html 有以下几种方法用于优化数据的批量插入. 1. 关闭自动提交: ...
- C#使用SqlDataAdapter 实现数据的批量插入和更新
近日由于项目要求在需要实现中型数据的批量插入和更新,晚上无聊,在网上看到看到这样的一个实现方法,特摘抄过来,以便以后可能用到参考. 一.数据的插入 DateTime begin = DateTime. ...
- MySQL 避免重复数据的批量插入与批量更新
[转发] 导读 我们在向数据库里批量插入数据的时候,会遇到要将原有主键或者unique索引所在记录更新的情况,而如果没有主键或者unique索引冲突的时候,直接执行插入操作. 这种情况下,有三种方式执 ...
- MSSQL使用sqlbulkcopy批量插入数据
具体代码如下: /// <summary> /// 批量插入数据到BayonetZipFailedPic表 /// </summary> /// <param name= ...
- SQL Server中中数据行批量插入脚本的存储实现
看到博友SQL Server MVP桦仔的一篇博文“将表里的数据批量生成INSERT语句的存储过程的实现”.我仔细看来博文中的两个存储代码,自我感觉两个都不太满意,都是生成的单行模式的插入,数 ...
- Hibernate 数据的批量插入、更新和删除
4.2 Hibernate的批量处理 Hibernate完全以面向对象的方式来操作数据库,当程序里以面向对象的方式操作持久化对象时,将被自动转换为对数据库的操作.例如调用Session的delete ...
- java mysql大数据量批量插入与流式读取分析
总结下这周帮助客户解决报表生成操作的mysql 驱动的使用上的一些问题,与解决方案.由于生成报表逻辑要从数据库读取大量数据并在内存中加工处理后在 生成大量的汇总数据然后写入到数据库.基本流程是 读取- ...
- Java使用JDBC连接数据库逐条插入数据、批量插入数据、以及通过SQL语句批量导入数据的效率对比
测试用的示例java代码: package com.zifeiy.test.normal; import java.io.File; import java.io.FileOutputStream; ...
- SQL Server 大数据量批量插入
private void AddShuJu_Click(object sender, RoutedEventArgs e) { Stopwatch wath = new Stopwatch(); wa ...
随机推荐
- Python自动化之线程进阶篇(二)
queue队列 class queue.Queue(maxsize=0) #先入先出 class queue.LifoQueue(maxsize=0) #后入先出 class queue.Priori ...
- 9.1---上楼梯(CC150)
注意:错误主要在溢出问题上.所以不设置int,而是long. public static int countWays(int n){ if(n == 1) return 1; if(n == 2) r ...
- python——常用功能之文本处理
前言 在生活.工作中,python一直都是一个好帮手.在python的众多功能中,我觉得文本处理是最常用的.下面是平常使用中的一些总结.环境是python 3.3 0. 基础 在python中,使用s ...
- poj 2488
http://poj.org/problem?id=2488 题意:就是让马把棋盘都走完,每一个点都要走到,出口就是a,b. #include <stdio.h> #include < ...
- 使用logrotate管理nginx日志文件
本文转载自:http://linux008.blog.51cto.com/2837805/555829 描述:linux日志文件如果不定期清理,会填满整个磁盘.这样会很危险,因此日志管理是系统管理员日 ...
- C# 静态函数调用窗体控件
回调函数方法是静态函数,需要调用窗体控件,赋值或取值. 定义 public static Form1 mainFrm; mainFrm = this; public partial class F ...
- FFMpeg ver 20160219-git-98a0053 滤镜中英文对照 2016.02.21 by 1CM
FFMpeg ver 20160219-git-98a0053 滤镜中英文对照 2016.02.21 by 1CM T.. = Timeline support 支持时间轴 .S. = Slice t ...
- Java for LeetCode 226 Invert Binary Tree
Invert a binary tree. 4 / \ 2 7 / \ / \ 1 3 6 9 to 4 / \ 7 2 / \ / \ 9 6 3 1 Trivia: This problem wa ...
- vector在C++中的基本用法
在写BlackJackGame的时候,考虑到要用到容器,所以就对容器的相关知识强化了一下: 因为我想的是有card类,最后要实现发牌,洗牌等等一系列的操作的时候,使用指向card类的对象的指针,将ca ...
- IOS-委托代理(degegate)
委托代理: 委托代理(degegate)顾名思义,把某个对象要做的事情委托给别的对象去做.那么别的对象就是这个对象的代理,代替它来打理要做的事.反映到程序中, 首先要明确一个对象的委托方是哪个对象,委 ...