Sql server 触发器由同一表上的内部select重新触发

Sql server 触发器由同一表上的内部select重新触发,sql-server,triggers,Sql Server,Triggers,我有一个非常奇怪的问题,我花了几个小时才发现。我的代码在定义了静态@Start和@End变量的测试过程中工作得非常好,但在触发器中,这些变量被意外地更新,原因是第一块代码中插入值到@tbl的行 我怀疑这一定是因为我正在从触发器所针对的同一个表中选择值。然而,由于这只是一个选择,而不是一个更新,我从来没有预料到这种行为 我需要完成以下工作:更新任务时,我需要检查所有其他任务是否完成,如果完成,则执行内部逻辑 在此,我将非常感谢您的一些见解。这件事我已经坚持了好几天了 在tblTasks上创建触发器

我有一个非常奇怪的问题,我花了几个小时才发现。我的代码在定义了静态@Start和@End变量的测试过程中工作得非常好,但在触发器中,这些变量被意外地更新,原因是第一块代码中插入值到@tbl的行

我怀疑这一定是因为我正在从触发器所针对的同一个表中选择值。然而,由于这只是一个选择,而不是一个更新,我从来没有预料到这种行为

我需要完成以下工作:更新任务时,我需要检查所有其他任务是否完成,如果完成,则执行内部逻辑

在此,我将非常感谢您的一些见解。这件事我已经坚持了好几天了

在tblTasks上创建触发器ut任务更新PC 更新后 像 -全局变量 声明@Start int、@End int、@ChoreID int set@ChoreID=从中选择ChoreID 设置@开始=从插入的PC中选择PC-PC=完成百分比 set@End=从已删除的PC中选择PC 打印'1A:Start'+cast@Start作为varchar12+',End='+cast@End如瓦查尔12 -逻辑 如果@Start=100和@End=100,则开始 打印“不做任何事情:案例1” 如果@Start=100且@End0和@end 0开始,则结束else-所需情况 -从未达到 终止 终止 如果问题不是很明显,您可以尝试下面的代码进行测试

-测试:使用此示例表并添加上述触发器 -我删掉了很多无关的代码,但这应该 -反映出和我一样的问题 创建表tblTask TaskID int IDENTITY1,1不为空, ChoreID int不为空, PC int, 无槽钻头
你的扳机坏了。它假定插入和删除的值只有一个。在多个记录更新的情况下,它将无法正常工作。这需要完全重写,以避免使用标量变量来保存插入的值。而且,在SQL Server中的触发器for futre REFERENCE触发器中,您不应该使用print语句,而不是按行运行,因此每次更新都会触发一次。@HLGEM:在GUI上,我一次只更新一个任务,因此,在这种情况下,这应该是好的,至于使用打印,为什么不呢?我应该用什么来代替?无论如何,这只是暂时的测试。数据库永远不会只受GUI的影响。在编写触发器时,您甚至不应该考虑GUI。假设只有一条记录会被更改是不负责任的。根据定义,触发器必须能够处理来自任何地方的更新,包括基于集合的更新,其中可能更改整个客户端的数据或插入新客户端的历史数据或删除所有旧客户端的数据。打印在触发器中是无用的。触发器需要尽可能快地运行,而使用打印语句会减慢它们的运行速度。