SQL Server 触发器批量数据行处理
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 触发器批量数据行处理相关推荐
- sql server 触发器实时同步数据库表数据
sql server 触发器实时同步数据库表数据 创建两个相同结构的数据库表 CREATE TABLE [dbo].[Table_1]([id] [varchar](50) NOT NULL,[nam ...
- sql server合并行_合并SQL Server复制参数化的行筛选器问题
sql server合并行 In this article we will discuss about SQL Server Merge Replication Parameterized row f ...
- SQL Server 触发器学习总结
SQL菜鸟入门级教程之触发器 触发器简介: 触发器(trigger)是种特殊的存储过程,它的执行不是由程序调用,也不需要手动操作,它是由事件来触发,事件大家应该非常熟悉吧,比如按钮的Click事件 ...
- mysql 触发器 sql server_喜忧参半的SQL Server触发器
SQL Server触发器在非常有争议的主题.它们能以较低的成本提供便利,但经常被开发人员.DBA误用,导致性能瓶颈或维护性挑战. 本文简要回顾了触发器,并深入讨论了如何有效地使用触发器,以及何时触发 ...
- oracle批量加载,Oracle教程:使用SQL*Loader高速批量数据加载工具
Oracle教程:使用SQL*Loader高速批量数据加载工具 1.控制文件中包含要加载的数据 首先创建一张测试表 然后创建一个控制文件(其中包含被加载的数据) 然后在命令行执行加载 查看dept表 ...
- SQL server触发器中 update insert delete 分别给写个例子被。
SQL server触发器中 update insert delete 分别给写个例子以及解释下例子的作用和意思被, 万分感谢!!!! 主要想知道下各个语句的书写规范. INSERT: 表1 (ID, ...
- 了解SQL Server触发器及触发器中的事务
引述 首先,写这篇文章的目的是望能把我对触发器的理解,分享出来与大家一起学习.如果你对触发器和事务的概念有些了解,这篇文章对你来说会是很简单,或能让你更进一步的了解触发器里面的一些故事,以及触发器中事 ...
- 【转】了解SQL Server触发器及触发器中的事务
引述 首先, 说下我写篇文章的目的,我希望能把我对触发器的理解,分享出来与你一起学习.如果你有对触发器和事务的概念,有些了解,这篇文章,对你来说会是很简单,或能让你更进一步的了解触发器里面的一些故事, ...
- SQL Server :理解数据记录结构
原文:SQL Server :理解数据记录结构 在SQL Server :理解数据页结构我们提到每条记录都有7 bytes的系统行开销,那这个7 bytes行开销到底是一个什么样的结构,我们一起来看下 ...
最新文章
- STM32中3个延时函数
- nginx php post限制,叫你如何修改Nginx与PHP的文件上传大小限制
- Java程序员面试时应注意的三个经典问题!
- 打印图片预览时图片显示不出来_办公小技巧:深入挖掘实用的Excel打印秘诀
- Pyechart:30分钟学会pyecharts数据可视化
- 轩辕传奇服务器合并信息,轩辕传奇9月1日部分服务器合服公告
- 深度残差收缩网络:(一)背景知识
- 基于meanshift的手势跟踪与电脑鼠标控制(手势交互系统)
- Mac下node.js卸载方法收集
- Netty内存池泄漏问题
- 如何从计算机中删除 Exchange Server 2003
- 步步为营 .NET三层架构解析 五、DAL与IDAL的设计
- 51单片机跑马灯程序
- 如何更改电脑IP地址 哪个IP转换器比较好用
- 数模电路基础知识 —— 4. 常见电路符号说明(二极管)
- 硬件设计——一键开关机
- VMware Horizon 8安装部署(八)访问测试,成功部署。
- KMS和MAK的区别
- python 调用另一个python文件
- 论文的开题报告是什么样的?