类型:翻译工具大小:4.4M语言:多语言【中文】评分:8.1标签:立即下载当我们想要更新一个动态表(也就是表中的数据不断被添加)的时候,也许我们会用数据库代理写一个作业,然后让他定期查询动态表中新添加的数据,然后更新数据。这样可以更新数据,但不能实时同步更新数据。这个时候,扳机就是我们想要的神器。我们可以在动态表上创建一个新的触发器。触发器本质上是一个存储过程,只是它调用的时间是根据创建的动态表执行的(即插入新数据、更新或删除数据)。今天就不介绍如何使用扳机了。花园里有很多信息。那么今天我要介绍什么呢?前几天在写sql代码的时候,偶然发现了这样一个问题:我一直以为每次一条数据插入到动态表中,触发器都会执行一次,但是我这样理解,批量插入数据的时候,触发器执行的次数和插入的行数是一样的,但事实并非如此。趁着今天的一点时间,我想写出来和大家分享一下。请改正你的错误!下面,我就写一个简单的例子供大家参考。
-我们想建立一个触发器的动态表,创建table _ a (id int identity (1,1),-自添加id content nvarchar (50),更新id fortrigger int),然后在这个表上创建一个触发器
创建TRIGGER [dbo]。[Table _ a _ Ins]开[dbo]。[Table_a]AFTER INSERTAS BEGIN declare @ ID int set @ ID=(从insert中选择ID)-更新Table _ a中UpdateIDForTrigger字段的值,为了更清晰地看到实时执行的效果,updatetable _ a设置了UpdateIDForTrigger=(@ id10)-为了看出区别,直接将比ID大10的值赋为变量,WHERE ID=@ IDEND接下来,我们根据普通条的插入结果进行测试:
-向信息表中添加数据插入table _ a (content)值(“信息一”);插入table _ a(内容)值(“信息2”);然后查询动态表中的数据
从表a中选择*的查询结果如下:
我们可以看到触发器已经执行。当插入每段数据时,触发器同时执行更新功能。然后,我们需要批量插入数据。为了便于插入,我们在这里设置了一个临时的基本信息表:
-基本信息表创建table _ info (id int identity (1,1),content nvarchar (50)),然后插入数据
插入table _ info(内容)值(“信息三”);插入table _ info(内容)值(“信息四”);插入table _ info(内容)值(“信息五”);插入table _ info(内容)值(“信息六”);插入table _ info(内容)值(“信息七”);插入table _ info(内容)值(“信息八”);插入table _ info(内容)值(“信息九”);插入table _ info(内容)值(“信息十”);然后我们可以将数据分批插入动态表中
插入表a(内容)从表信息中选择内容这一次,当我们执行这个sql语句时,消息框中将出现一条错误消息:
有经验的朋友会知道,这个错误是由用“=”将多个结果赋给一个变量引起的。即设置@ variable=(从表中选择多行结果)。这时,我感到困惑。有什么问题?不是每次插入一条数据就执行触发器吗?所以,我换了扳机:
Alter TRIGGER [dbo]。[Table _ a _ Ins]开[dbo]。在插入开始后,从插入的中选择标识;END然后尝试执行上面的批量插入,看看在他插入的表中存储了什么值:不出所料,插入的表中的结果不是一条数据:
知道了错误的原因,我们就很容易操作了。我们可以为插入的表创建一个游标,然后编辑通过游标成批插入的每一行数据。以下是我们修改后的触发代码:
Alter TRIGGER [dbo]。[Table _ a _ Ins]开[dbo]。[Table _ a]INSERT AS BEGIN declare @ID int declare cur _ INSERT游标用于从插入的open cur中选择ID _ INSERT fetch next from cur _ INSERT进入@ ID同时@ @ fetch _ status=0 BEGIN update Table _ a set updateIDfortrigger=(@ ID 10)-为了看出区别,直接将一个比ID大10的值赋为变量WHERE ID=@ ID从cur _ insert获取next进入@ id end close cur _ insert解除分配cur _ insert end然后,我们按照上面的批次插入数据,然后在动态表中查询结果:
插入表格(内容)从表格信息中选择内容;从表中选择*;此时没有错误提示,运行结果如下:
这样,批量插入数据时可以使用触发器。总而言之,每次执行插入操作或更新、删除操作时,都会执行触发操作。它的对象不是修改行数(也就是说,每一行都是在修改时执行的)。