我正在尝试在SQL触发器中执行查询。
我有4张表A, B, C, D
。表A是查找列表,包含大约1400行数据。表B是通过具有时间戳的HMI输入的值。表C是我的值要去的表。表D是用于将表A中的值乘以表B的乘数列表(我目前仅使用表D中的一个乘数)。
当用户将数据输入到表B中时,应该触发过程以获取插入的值(包括itemnumber)并将itemnumber与表A相关联并使用表D将几个事物相乘以将值发送到表C.例如,如果我只在表B中输入3行数据,我应该只在表C中获得三行数据。我只是使用表A来匹配项目编号并获得一些数据。但由于某种原因,我插入的记录多于预期,超过1600行。
表D乘数的时间戳与任何其他表不匹配或没有任何关联。所以我使用时间戳并选择最接近表B中时间戳的乘数(一些乘数会随着时间的推移而改变,我需要一个历史乘数来正确地将正确的东西相乘)
非常感谢您的帮助。谢谢。
Insert into TableC( ItemNumber, Cases, [Description], [Type], Wic, Elc, TotalElc, LbsPerCase, TotalLbs, PeopleRequired, ScheduleHours, Rated, Capacity, [TimeStamp])
Select
b.ItemNumber, b.CaseCount, a.ItemDescription, a.DivisionCode, a.workcenter,
a.LaborPercase as ELC, b.CaseCount * a.LaborPerCase * d.IpCg,
a.LbsPerCase, a.LaborPerCase * b.CaseCount as TotalLbs,
a.PersonReqd, b.Schedulehours, a.PoundRating,
b.ScheduleHours * a.PoundRating as Capactity, b.shift, GETDATE()
from
TableA a, TableB b, TableD
Where
a.itemnumber = b.itemnumber
and d.IpCG < b.TimeStamp
and b.CasesCount > 0
答案 0 :(得分:0)
您不会引用仅在触发器中可用的已插入或已删除的表,因此您当然会在查询中返回所需的更多记录。
首次编写触发器时,我所做的是创建一个名为#inserted(和/或#deleted)的临时表,并用几个记录填充它。它应该与触发器所在表格的设计相匹配。让临时表具有多个输入记录非常重要,这些记录可能会满足影响查询的各种条件(因此,在您的情况下,您需要一些案例计数为0的情况,而某些情况则不会例如),这将是典型的插入表或更新的init的数据。 SQL服务器触发器对数据集进行操作,因此这也确保您的触发器可以正确处理多个记录uiinserts或更新。正确编写的触发器将包含您需要测试的测试用例以确保一切正常,您的#inserted表应包含满足所有这些测试用例的记录。
然后在事务中编写查询(并在测试时将其回滚)加入#inserted。如果您正在使用select进行插入,只需编写选择部分直到您正确,然后添加插入。要进行测试,请从要插入的表中写入一个选择,以便在回滚之前查看插入的数据。
一旦你完成所有工作,将#inserted引用更改为插入,删除任何测试代码,当然还有回滚(可能是整个事务处理你正在做的事情。)并添加drop并创建代码的触发器部分。现在你可以测试触发器作为一个触发器,但是你很好,因为你知道它可能会从你之前的测试中发挥作用。