SQL触发器使用另一个表更新表

时间:2012-08-22 16:33:41

标签: sql sql-server-2008r2-express

大家好,我仍然是SQL的新手,我有一个小问题,也许有人可以提供帮助。

我已经研究了所有关于触发器的内容以及我读到的内容是有道理的,但由于某些原因我无法得到它所需要的答案所以我将解释我需要做什么

我有两张桌子ProductsLabelPrint

products中有5列upc, itemcode, description, price, labelprint

LabelPrint中有相同的列

我需要的是一个触发器,用于创建新项目或编辑旧项目,并将列LabelPrint修改为= 1表示是

我需要将相关项目复制到labelprint表格

label print表会在一段时间后自动清除这些项目,我希望有人可以帮助我理解如何让这个触发器以我希望的方式工作

感谢brandon

1 个答案:

答案 0 :(得分:0)

我会尝试这样的事情:

CREATE TRIGGER InsertProducts
ON dbo.Products
FOR INSERT
AS 
   INSERT INTO dbo.LabelPrint(upc, itemcode, description, price, labelprint)
      SELECT
         upc, itemcode, description, price, labelprint
      FROM Inserted
      WHERE labelprint = 1

每当您将数据插入表dbo.Products时,第一个触发器都会触发,如果labelprint列设置为1,则会将这些行插入dbo.LabelPrint同样。

UPDATE有点棘手:

CREATE TRIGGER UpdateProducts
ON dbo.Products
FOR UPDATE
AS 
   INSERT INTO dbo.LabelPrint(upc, itemcode, description, price, labelprint)
      SELECT
         i.upc, i.itemcode, i.description, i.price, i.labelprint
      FROM Inserted i
      INNER JOIN Deleted d ON i.itemcode = d.itemcode
      WHERE i.labelprint = 1 AND d.labelprint <> 1

在这里,我检查该行是否已更新(不是100%确定itemcode是否是用于链接旧值和新值的最佳列 - 如果不是,则根据需要进行调整),然后我确保旧值(来自Deleted伪表)不是1而新值(来自Inserted)是1 - 在这种情况下,列{ {1}}已更新为1,该行将被复制到LabelPrint表中。

需要注意的一点是:您需要注意SQL Server 触发正在插入和/或更新的每一行的触发器。触发器将为每个语句触发 - 并且一个语句可以很好地更新50行 - 在这种情况下,触发器会触发一次,并且内部的伪表触发器(LabelPrintInserted)每个将包含50行。只是不要假设Deleted只包含一行 - 这种假设完全是假的。