临时表:Test

  1. /****** 对象: Table [dbo].[Test] 脚本日期: 05/10/2013 11:42:07 ******/
  2. SET ANSI_NULLS ON
  3. GO
  4. SET QUOTED_IDENTIFIER ON
  5. GO
  6. CREATE TABLE [dbo].[Test](
  7. [ID] [int] IDENTITY(1,1) NOT NULL,
  8. [UserID] [int] NOT NULL,
  9. [UserName] [nvarchar](50) COLLATE Chinese_PRC_CI_AS NULL,
  10. CONSTRAINT [PK_Test] PRIMARY KEY CLUSTERED
  11. (
  12. [ID] ASC
  13. )WITH (IGNORE_DUP_KEY = OFF) ON [PRIMARY]
  14. ) ON [PRIMARY]

临时表的触发器:tri_edit

  1. CREATE TRIGGER [tri_edit] ON [dbo].[Test]
  2. instead of insert
  3. as

  4. declare @temp int
  5.  
  6. select @temp= inserted.UserID from inserted

--更新已经存在的主键(更新全部字段)
if(@temp IS Not NULL )

update [Test] set UserQQ=inserted.UserQQ
from [Test]  join inserted  on [Test].UserID=inserted.UserID

else --(更新指定的部分字段)

update [Test] set UserName=inserted.UserName
from [Test]  join inserted  on [Test].UserID=inserted.UserID

--插入存在的主键数据
insert [Test] (UserID,UserName)
select inserted.UserID,inserted.UserName
from inserted  left join [Test]  on inserted.UserID=[Test].UserID
where [Test].id is null

go

C#  SqlBulkCopy方法:

  1. /// <summary>
  2. /// SqlBulkCopy往数据库中批量插入数据
  3. /// </summary>
  4. /// <param name="sourceDataTable">数据源表</param>
  5. /// <param name="targetTableName">服务器上目标表</param>
  6. /// <param name="mapping">创建新的列映射,并使用列序号引用源列和目标列的列名称。</param>
  7. public static void BulkToDB(DataTable sourceDataTable, string targetTableName, SqlBulkCopyColumnMapping[] mapping)
  8. {
  9. /* 调用方法 - 2013年05月10日编写
  10. //DataTable dt = Get_All_RoomState_ByHID();
  11. //SqlBulkCopyColumnMapping[] mapping = new SqlBulkCopyColumnMapping[4];
  12. //mapping[0] = new SqlBulkCopyColumnMapping("Xing_H_ID", "Xing_H_ID");
  13. //mapping[1] = new SqlBulkCopyColumnMapping("H_Name", "H_Name");
  14. //mapping[2] = new SqlBulkCopyColumnMapping("H_sName", "H_sName");
  15. //mapping[3] = new SqlBulkCopyColumnMapping("H_eName", "H_eName");
  16. //BulkToDB(dt, "Bak_Tts_Hotel_Name", mapping);
  17. */

using (SqlConnection conn = new SqlConnection(DBHelper.ConnectionString))
            {
                //SqlBulkCopy bulkCopy = new SqlBulkCopy(conn);   //用其它源的数据有效批量加载sql server表中
                //指定大容量插入是否对表激发触发器。此属性的默认值为 False。
                SqlBulkCopy bulkCopy = new SqlBulkCopy(DBHelper.ConnectionString, SqlBulkCopyOptions.FireTriggers);
                bulkCopy.DestinationTableName = targetTableName;    //服务器上目标表的名称
                bulkCopy.BatchSize = sourceDataTable.Rows.Count;   //每一批次中的行数
                //bulkCopy.BulkCopyTimeout = 300; //超时之前操作完成所允许的秒数,大批量数量需要的时长5分钟,2013-11-6备注 报错:“超时时间已到。在操作完成之前超时时间已过或服务器未响应”  解决办法

if (sourceDataTable != null && sourceDataTable.Rows.Count != 0)
                {
                    for (int i = 0; i < mapping.Length; i++)
                        bulkCopy.ColumnMappings.Add(mapping[i]);

//将提供的数据源中的所有行复制到目标表中
                    bulkCopy.WriteToServer(sourceDataTable);
                }
            }

C# 调用BulkToDB方法:

  1. int kk = Environment.TickCount;
  2. DataTable dt = new DataTable();
  3. dt.Columns.Add(new DataColumn("UserID", typeof(string)));
  4. dt.Columns.Add(new DataColumn("UserName", typeof(string)));
  5. for (int k = 0; k < 10000; k++) //40000
  6. {
  7. DataRow dr = dt.NewRow();
  8. dr["UserID"] = k;
  9. dr["UserName"] = "8888 - " + k;
  10. dt.Rows.Add(dr);
  11. }
  12. SqlBulkCopyColumnMapping[] mapp = new SqlBulkCopyColumnMapping[2];
  13. mapp[0] = new SqlBulkCopyColumnMapping("UserID", "UserID");
  14. mapp[1] = new SqlBulkCopyColumnMapping("UserName", "UserName");
  15. //提交任务表
  16. BulkToDB(dt, "Test", mapp);
  17. int exeg = Environment.TickCount - kk;
  18. MessageBox.Show(exeg.ToString());

动态加载数据列名:

  1. SqlBulkCopyColumnMapping[] mapp = new SqlBulkCopyColumnMapping[dt.Columns.Count];
  2. for (int j = 0; j < dt.Columns.Count; j++)
  3. {
  4. mapp[j] = new SqlBulkCopyColumnMapping(dt.Columns[j].ColumnName, dt.Columns[j].ColumnName);
  5. }
  1. 1、--处理的触发器示例
  2. create trigger tr_insert on
  3. instead of insert --注意触发器的类型
  4. as
  5. --更新已经存在的主键
  6. update set name=b.name,sex=b.sex
  7. from a join inserted b on a.id=b.id
  8.  
  9. --插入存在的主键数据
  10. insert
  11. select a.*
  12. from inserted a left join b on a.id=b.id
  13. where b.id is null
  14. go
  15. ——————————————————————————————————————————
  16.  
  17. 2、--触发器
  18. CREATE TRIGGER tri_edit ON tab
  19. INSTEAD OF INSERT
  20. AS
  21.  
  22. if exists(select col1,col2 from tab join inserted on tab.学号=INSERTED.学号)
  23. begin
  24. --这里面你可以加如些其他修改操作,取决于具体的功能
  25. update tab set col1='num1' from tab join inserted on tab.学号=inserted.学号
  26. end
  27. else
  28. insert tab select * from inserted
  29. GO

SqlBulkCopy与触发器,批量插入表(存在则更新,不存在则插入)的更多相关文章

  1. SQL Server 利用触发器对多表视图进行更新

    其步骤就是:利用update操作触发器产生的2个虚拟表[inserted]用来存储修改的数据信息和[deleted]表,然后将对应的数据更新到对应数据表中的字段信息中: 1.首先创建3个表: a.信息 ...

  2. SQL批量插入表类 SqlBulkInsert

    ado.net已经有了sqlBulkCopy, 但是那个用xml格式,网络传输数据量太大. 自己实现了一个,传输尽量少的字节. 性能没对比过,有需要的自己拿去测试. using System.Data ...

  3. SQL语句-批量插入表(表数据插表)

    批量插入表(表数据插表) ****1.INSERT INTO SELECT语句语句形式为:Insert into Table2(field1,field2,...) select value1,val ...

  4. C#使用SqlBulkCopy将DataTable写入数据库的表中(表不存在则创建新表,数据存在则更新,不存在则插入)

    原文:.net使用SqlBulkCopy导入数据(创建新表) .net2.0后ado.net提供了一个快速导入sqlserver的方法sqlbulkcopy.导入效率非常高.  包装了一个简单的sql ...

  5. SQL SERVER 使用BULK Insert将txt文件中的数据批量插入表中(1)

    1/首先建立数据表 CREATE TABLE BasicMsg( RecvTime FLOAT NOT NULL , --接收时间,不存在时间相同的数据 AA INT NOT NULL, --24位地 ...

  6. SQL触发器批量删除数据库中的表

    以下通过触发器批量删除数据库中的表,SQL2008已验证 DECLARE @Table NVARCHAR() DECLARE @Count Int = DECLARE tmpCur CURSOR FO ...

  7. C#:用SqlBulkCopy来实现批量插入数据

    SqlBulkCopy是.net2.0的新特性,平时用的很少,但是其功能却是非常强大,对于批量插入数据性能非常优越 代码 /// /// bulk插入/// private void BulkInse ...

  8. SQL Server批量向表中插入多行数据语句

    因自己学习测试需要,需要两个有大量不重复行的表,表中行数越多越好.手动编写SQL语句,通过循环,批量向表中插入数据,考虑到避免一致问题,设置奇偶行不同.个人水平有限,如有错误,还望指正. 语句如下: ...

  9. SQLSERVER:通过sys.tables实现批量删表、快速统计多表记录和

    SQLSERVER:通过sys.tables实现批量删表,或者回滚表 begin try drop table #temp10 end try begin catch end catch select ...

随机推荐

  1. 学习记录 java 值类型和引用类型的知识

    1. Java中值类型和引用类型的不同? [定义] 引用类型表示你操作的数据是同一个,也就是说当你传一个参数给另一个方法时,你在另一个方法中改变这个变量的值, 那么调用这个方法是传入的变量的值也将改变 ...

  2. Java基础——异常体系

    在Java中,异常对象都是派生于Throwable类的一个实例,Java的异常体系如下图所示: 所有的异常都是由Throwable继承而来,在下一层立即分解为两个分支,Error和Exception. ...

  3. sass mapsource --->gulp

    详细,请戳这里 1.安装插件 npm install --save-dev gulp-sass gulp-sourcemaps gulp-autoprefixer 如果安装错误,请用sudo 权限: ...

  4. Date获取时间段

    /** * */ package com.chinabase.common.util; /** * @author yuanji * @created on:Sep 19, 2008 */ impor ...

  5. 【c实现,vc6调试通过】给出一字符串指针,计算出字符串指针中单词数

    #include <stdio.h> /* 给出一字符串指针,计算出字符串指针中单词数, 单词不包括'.',',',';','?','_','"',由0-9数字或26个字母组成 ...

  6. Linux之档案管理

    1:档案类型[1] d :目录 -:档案 l:链接档 b:装置文件中可存储接口设备 c:装置文件中串行设备,例如:键盘,鼠标 2:RWX: R:read (可读),W:write(可写),X:excu ...

  7. 设计模式-单例模式(Singleton)

    模式说明: 保证每一个类仅有一个实例,并提供一个访问它的全局访问点(即自行实例化并向整个系统提供这个实例). 应用场景: 1.如配置文件取值类AppConfig(本身实例化对象比较大,且没有必要实例化 ...

  8. CentOS学习笔记--MySQL安装

    MySQL安装 Linux中使用最广泛的数据库就是MySQL,使用在线yum的方式安装的版本落后MySQL网站好几个小版本,本节亲自测试安装新版的MySQL. 测试机器环境: VMware Works ...

  9. RocketMQ学习记录

    RocketMQ是一款分布式.队列模型的消息中间件,具有以下特点: 1.能够保证严格的消息顺序 2.提供丰富的消息拉取模式 3.高效的订阅者水平扩展能力 4.实时的消息订阅机制 5.亿级消息堆积能力 ...

  10. 转:OpenCms 9.0.1汉化

    LHD私人汉化. 1.完成安装OpenCms 2.如果正确安装,在浏览器输入以下地址即可打开登录页面(默认账号/密码:Admin/admin) http://localhost:8080/opencm ...