MSSQL数据的批量插入

一、概述:

  对于数据的批量插入操作似乎成了某些大数据量操作的必用手段,MSSQL也提供了一些数据批量插入的操作方法,先将这些方法汇总,以便于下次用到使用。面对数据的批量插入操作,我们也应该考虑一个问题----数据的完整性。批量的操作有时候并不能保证所有数据的成功操作,那么如何保证数据的完整性那?

二、批量插入的方法:

1、insert into 后面跟数据列表:

INSERT INTO Score VALUES (102,87),(183,180),(104,99) ,(102,87),(183,180),(104,99)  

这种操作远比一条条数据的插入效率高好多;

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 (102,87)  
--INSERT INTO Score VALUES (183,180)  
--INSERT INTO Score VALUES (104,99) 
INSERT INTO Score VALUES (102,87),(183,180),(104,99)  
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

原文地址:https://www.cnblogs.com/xibei666/p/5231505.html