wodeqq584958184
wodeqq584958184
2018-05-03 07:02
采纳率: 77.8%
浏览 836

关于SQL触发器数据筛选或者插入代码问题

现在公司有台机器,机器的状态有0,1,2,3,机器开启运行状态的时候是0,其他的 1、2和3对应的是其他状态,机器一开启就会自动有数据生成,生成的数据信息如(图1),
此图中的表原本是table1,但由于数据量大,暂时用table6替代。

图1

down机的时候,(也就是从0变为非0的时候,也就是0到1,或0到2,或者0到3这样的状态)table2会有数据记录产生,产生的数据记录其实就是错误代码。而每一次table1发生down机状态记录的时候,都会有个故障时间数据产生(即table1的非0数据记录的itime字段),故障了那么table2肯定会插入错误代码,但在这一个故障时间段直到下次机器变为0状态恢复运行时,错误代码有很多,例如下图是其中一个table6的down机过程:

图2

下图就是table2造成此次down机的所有错误代码

图3

由此可见,此次down机状态的时间是13点58分35秒,并且在13点59分22秒机器恢复运行(table2里runtime字段时间其实就是机器下次恢复运行变为0的时间),这2秒的时间里造成此次down机的错误代码有许多条,并且有些错误代码都在一个时间点上13点58分36秒,但有些不是,

现在我上司想要实现的效果就是,table6的每一次down机状态,我只要table2相对应此次down机状态的最先报错第一条代码,其他错误代码其他时间都不要,只要一条,并把此条错误代码数据记录的location字段和pointer字段还有itime值插入到table4中,

现在我建立了两个触发器,一个是table6的触发器,当table6有0变为非0再变为0时,触发这个触发器,把此次table6的down机的数据New-status和itimez字段传递到table4中,这一步已经实现了。
Table6的触发器
T1
但第二个触发器问题来了,
T2
第二个触发器是建立在table2的,因为要筛选出最新出来的错误代码,所以思路是:table6每次down机时,用table6的非0记录itime时间与table2出现最新一条错误代码记录的itime做对比,也就是(where itime>=@T6-itime order by itime desc),然后编写插入数据时候的判断,然后插入应该就可以了。但不知道为什么,进来的错误代码数据并没有筛选过,而是直接插入进table4去了,也就是说,往后出现的错误代码也会一直往table4插入进去。例如下图table4:
T2图
这里我在table2插入了两条,然后table4也插入了两条,按道理来说,应该只有一条啊。
请问我的table2触发器代码哪里出问题了,请大神帮我分析下,可以加我QQ详细描述:584958184

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 邀请回答

4条回答 默认 最新

  • feelcycle_07
    默默悟问 2018-05-04 06:29
    已采纳

    第1行你可以合并到你的declare中

    declare @T2_count int
    
    select  @T2_count = count(*) from table2 where itime >= @T1_itime
    
    if (@new_Status <> 0 and @new_Status2=0 and @T2_count=1)
    
    点赞 评论
  • devmiao
    devmiao 2018-05-03 07:06
    点赞 评论
  • wodeqq584958184
    wodeqq584958184 2018-05-03 08:54

    还有其他大神吗 能不能看出我哪里有问题

    点赞 评论
  • feelcycle_07
    默默悟问 2018-05-03 13:25

    最后一个触发器的最后一个select top应用用asc,这样你得到的才是最早的时间(如果你的最早就是指时间早)。
    然后你得避免多次插入,因为你的触发器是加入即触发。一种方法就是判断大于@T1_Time的错误状态多于1条也不插入。

    点赞 评论

相关推荐