SQL Server的触发器在数据批量处理时,只会触发一次触发器,后面的操作触发器全部失效,SQL Server执行语句并不是按行语句进行,所以在批量处理数据时,触发器需要特殊处理。

处理方式1:
    在触发器内新建一张临时表,将所有数据暂存在临时表(建议加上一个自增主键)中,循环临时表来触发触发器。
    下面是一个Demo,批量插入数据,判断Age是否大于150,若大于数据回滚。

USE [BlogDemo]
GO
/****** Object:  Trigger [dbo].[Trigger_Insert]    Script Date: 2019/5/29 10:52:10 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GOALTER TRIGGER [dbo].[Trigger_Insert]ON  [dbo].[Person]AFTER INSERT
AS
BEGINSET NOCOUNT ON;--新建一张临时表,并加入一个自增主键ID,便于后面的循环操作Create table #temp(ID int IDENTITY(1,1) PRIMARY KEY, PersonID int,Name varchar(50),Age int, AddDate datetime)Insert into #temp(PersonID, Name, Age, AddDate)Select ID, Name, Age, AddDate From insertedDeclare @i Int=1,@is Int=0SELECT @is =MAX([ID]) FROM #tempWHILE @i<@isBEGINDeclare @age int =0;Select @age=Age From #temp Where ID=@iIF(@age<150)BeginInsert into PersonLog(PersonID, Name, Age, AddDate)Select ID, Name, Age, AddDate From #temp Where ID=@iEndELSEBeginprint('年龄应小于150')rollback transactionENDSET @i=@i+1;ENDEND

处理方式2:
    在触发器内使用游标来循环数据触发触发器。
    同样的Demo如下:

USE [BlogDemo]
GO
/****** Object:  Trigger [dbo].[Trigger_Insert]    Script Date: 2019/5/29 10:52:10 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GOALTER TRIGGER [dbo].[Trigger_Insert]ON  [dbo].[Person]AFTER INSERT
AS
BEGINSET NOCOUNT ON;--游标也可以实现行机触发器Declare insert_cursor cursor Forward_Only staticFor Select ID,Name,Age,AddDate from insertedopen insert_cursorDeclare @Id int, @Name varchar(50), @Age int,@AddDate datetimeFetch From insert_cursor into @Id, @Name, @Age, @AddDatewhile @@FETCH_STATUS=0BeginIF(@Age>150)Beginprint('年龄应小于150')Rollback transaction ENDELSEInsert Into PersonLog(PersonID,Name,Age,AddDate)VALUES(@Id, @Name, @Age, @AddDate)Fetch Next From insert_cursor into  @Id, @Name, @Age, @AddDateENDclose insert_cursor  deallocate insert_cursorEND

Demo测试数据图:

SQL Server 触发器批量数据行处理相关推荐

  1. sql server 触发器实时同步数据库表数据

    sql server 触发器实时同步数据库表数据 创建两个相同结构的数据库表 CREATE TABLE [dbo].[Table_1]([id] [varchar](50) NOT NULL,[nam ...

  2. sql server合并行_合并SQL Server复制参数化的行筛选器问题

    sql server合并行 In this article we will discuss about SQL Server Merge Replication Parameterized row f ...

  3. SQL Server 触发器学习总结

    SQL菜鸟入门级教程之触发器 触发器简介:   触发器(trigger)是种特殊的存储过程,它的执行不是由程序调用,也不需要手动操作,它是由事件来触发,事件大家应该非常熟悉吧,比如按钮的Click事件 ...

  4. mysql 触发器 sql server_喜忧参半的SQL Server触发器

    SQL Server触发器在非常有争议的主题.它们能以较低的成本提供便利,但经常被开发人员.DBA误用,导致性能瓶颈或维护性挑战. 本文简要回顾了触发器,并深入讨论了如何有效地使用触发器,以及何时触发 ...

  5. oracle批量加载,Oracle教程:使用SQL*Loader高速批量数据加载工具

    Oracle教程:使用SQL*Loader高速批量数据加载工具 1.控制文件中包含要加载的数据 首先创建一张测试表 然后创建一个控制文件(其中包含被加载的数据) 然后在命令行执行加载 查看dept表 ...

  6. SQL server触发器中 update insert delete 分别给写个例子被。

    SQL server触发器中 update insert delete 分别给写个例子以及解释下例子的作用和意思被, 万分感谢!!!! 主要想知道下各个语句的书写规范. INSERT: 表1 (ID, ...

  7. 了解SQL Server触发器及触发器中的事务

    引述 首先,写这篇文章的目的是望能把我对触发器的理解,分享出来与大家一起学习.如果你对触发器和事务的概念有些了解,这篇文章对你来说会是很简单,或能让你更进一步的了解触发器里面的一些故事,以及触发器中事 ...

  8. 【转】了解SQL Server触发器及触发器中的事务

    引述 首先, 说下我写篇文章的目的,我希望能把我对触发器的理解,分享出来与你一起学习.如果你有对触发器和事务的概念,有些了解,这篇文章,对你来说会是很简单,或能让你更进一步的了解触发器里面的一些故事, ...

  9. SQL Server :理解数据记录结构

    原文:SQL Server :理解数据记录结构 在SQL Server :理解数据页结构我们提到每条记录都有7 bytes的系统行开销,那这个7 bytes行开销到底是一个什么样的结构,我们一起来看下 ...

最新文章

  1. STM32中3个延时函数
  2. nginx php post限制,叫你如何修改Nginx与PHP的文件上传大小限制
  3. Java程序员面试时应注意的三个经典问题!
  4. 打印图片预览时图片显示不出来_办公小技巧:深入挖掘实用的Excel打印秘诀
  5. Pyechart:30分钟学会pyecharts数据可视化
  6. 轩辕传奇服务器合并信息,轩辕传奇9月1日部分服务器合服公告
  7. 深度残差收缩网络:(一)背景知识
  8. 基于meanshift的手势跟踪与电脑鼠标控制(手势交互系统)
  9. Mac下node.js卸载方法收集
  10. Netty内存池泄漏问题
  11. 如何从计算机中删除 Exchange Server 2003
  12. 步步为营 .NET三层架构解析 五、DAL与IDAL的设计
  13. 51单片机跑马灯程序
  14. 如何更改电脑IP地址 哪个IP转换器比较好用
  15. 数模电路基础知识 —— 4. 常见电路符号说明(二极管)
  16. 硬件设计——一键开关机
  17. VMware Horizon 8安装部署(八)访问测试,成功部署。
  18. KMS和MAK的区别
  19. python 调用另一个python文件
  20. 论文的开题报告是什么样的?

热门文章

  1. 2005年毕业论文----J2ME手机游戏开发高计
  2. 华为HCIP安全 722
  3. 16广东各市人口数据(echarts)
  4. 汉诺塔问题(分治+源码+动画演示)
  5. 设计图纸管理-图纸管理系统哪家好呢
  6. ElasticSearch_12_ES的高性能设计
  7. 有哪位大神提供免费的AQWA分析软件的资料啊?
  8. linux脚本看日历,linux 下查看日历的命令为
  9. python爬取壁纸教程01 --wallheaven
  10. 性骚扰和性欲其实并没有太大关系